如何給老婆解釋什麼是微服務?

程序員有了老婆之後就是累,上次好不容易給她解釋了什麼是Restful,這不,麻煩又來了…

一個週日的清晨,陽光灑在我的臉上,慢慢把我喚醒。我翻過身,感覺好像少了些什麼東西,緩緩地睜開眼睛,“咦,老婆呢?”

突然,我發現床上多了張紙條:

看到這封信時,我已經在回孃家的路上,原因我相信你懂的。如果你不懂,請將信翻到背面。

我一臉懵逼,將紙翻了過來:

哼,你怎麼可能不知道原因,你翻過來看就是想確認我發現的是不是你那個秘密而已,那我就告訴你吧。

在你的書桌上,有一本叫 《微服務設計》 的書,我雖然是女生,但也知道“服務”是個什麼勾當,沒想到你放著好好的程序員不做,居然做起了“服務”,你和舊時代的老鴇有什麼區別?

書我翻了一下,想看看你的這種“微服務”是怎麼個“微”法,哼,你們程序員挺精明的,看的書都加密過的?別以為我不知道那些是代碼,是你們程序員的通用語言。鬼知道里面講了什麼東西。

不管怎樣,既然你選擇了這條路,也就別怪我不仁不義,再見。不,再也不見。 —— 對你很失望的靜香

我漸漸地緩過神來,百感交集,思緒萬千,冥想了一會,拿起手機,給她發了信息:

“下午四點,老地方,給你解釋什麼是微服務。”

沃爾茲百貨超市

我提前十五分鐘來到了咖啡廳。臨近四點,我開始望著門口,59分49秒,一個熟悉的身影走了進來,戴著墨鏡,披著紗巾,是她。

“服務員,一個芝士蛋糕,兩杯拿鐵,謝謝”,我對服務員說。

“說吧,你有什麼要解釋的?”

“嗯,首先,我向你保證,我在看的“微服務”,絕對不是你想的那種“服務””

“那是什麼?”

“這個解釋起來要花點時間,我們先吃點蛋糕,待會再慢慢和你解釋”

過了一會,蛋糕吃的差不多了。“看到對面那家沃爾茲百貨超市了麼?”,我指著窗外面的沃爾茲超市,對老婆說。

如何給老婆解釋什麼是微服務?

“嗯?”

“那裡面什麼都有,衣服、食品、文具、傢俬、電器,應有盡有,而且不管你去到哪一家連鎖店,店裡的格局都是一模一樣的。也正因為如此,這才帶來了問題。”

“有什麼問題呢?我覺得這樣挺好呀,顧客去了那裡,想買什麼都找得著。”

“首先,這些賣不同物品的 隔間之間會互相影響 。你看,一樓是珠寶店和電器店,假如珠寶店想進行裝修,裝修時的噪聲和灰塵,勢必會影響到電器店;還有,假如由於電器店一名員工的疏忽,引發了火災,旁邊的珠寶店是不是也會受到牽連?”

“你這烏鴉嘴…”

“哈哈,都說是假如啦。除了這點,還有一個問題,我考考你,我們這個城市裡有幾家沃爾茲超市?”

“我想想,好像就這一家?”

“沒錯,只在西區這裡開了一家店。這時候市場總監發現,住在東區的多是上層階級,他們對珠寶的需求量比較大,這時候要怎麼辦?”

“那就在東區也開一家沃爾茲百貨超市羅。”

“嗯,只能是這樣了,可是東區的居民對其他東西的需求並不多,而沃爾茲超市又想讓每家分店賣的東西都是一樣的,所以他們不得不在東區開一家分店,不僅賣珠寶,也賣食品、衣服還有其他東西“

“這挺浪費的呀, 為了滿足人們對珠寶的需求,又開了一個百貨超市 。”,老婆若有所思。

“的確,什麼都有、什麼都賣的百貨超市實在是太 笨重 了,這才有了“微服務””

“哦?終於要講微服務了?哼哼。”

沃爾茲小店

“你看,假如我們把沃爾茲百貨超市, 拆成很多個賣不同商品的小店 ,比如賣珠寶的沃爾福、賣傢俬的沃爾家、賣食品的沃爾良還有賣衣服的沃爾衣,這些提供不同服務的店,分佈在城市的各個地方,這樣他們之間就不會互相影響了。東區二巷的沃爾家搞裝修,三巷的沃爾福不會受到影響;三巷的沃爾福發生火災了,二巷的沃爾家也安然無恙。”

“Soga,原來是這種微服務”,老婆笑著說。

“不僅如此,現在,我們發現東區的居民對珠寶的需求量大,那我們就在東區 多開幾家沃爾福,而在西區,中產階級較多的地方,我們就多開幾家沃爾良。”

如何給老婆解釋什麼是微服務?

“哇塞,這樣看來,微服務讓沃爾茲變得 輕巧 了許多! 哪個地方對某種服務的需求大,就在對應的地方多開幾家賣那種服務的小店就好了 。”

沃爾茲網店

“看來微服務就是把一個百貨店變成各個小店嘛,講這個東西至於用那麼厚一本書麼?”,老婆是個好奇心很強的女生。

“哈,微服務當然不只是這些,我們現在只是把一個百貨店拆成各個小店,但是對於 如何管理這些小店 ,我們還沒做好準備”

“哦?這裡面還有什麼門道?”

“當然,別忘了,沃爾茲可是有網店的。以前還是百貨超市的時候,要是有顧客從網上買了一件衣服,那直接從百貨超市的倉庫裡取出這件衣服,給顧客寄過去就好了;現在呢,每一家賣衣服的沃爾衣都有自己的倉庫,顧客下單後, 工作人員要怎麼知道顧客所在區域有哪幾家沃爾衣?要從哪家沃爾衣發貨呢? ”

“喲西,還有這個問題。那 沃爾茲總店肯定知道他們在哪個地方開有什麼分店吧 ?”

“沒錯,這時候網店工作人員會從總店那裡查出,顧客收貨地址所在區域有哪些家沃爾衣,接下來就是從這些沃爾衣店裡,選一家,給顧客寄快遞過去。”

“就選離顧客最近那一家就好啦。”

“哈,那萬一東區有兩家沃爾衣,一家靠近居民區,一家靠近商業區,而顧客通常寫的收穫地址都是寫自己家呢?”

“這樣… 那靠近居民區的沃爾衣就會收到很多訂單,經常要不斷的進貨,而靠近商業區的那家,就沒什麼訂單了,是吧?”,老婆睜大雙眼看著我。

“對!這就是問題,所以網店工作人員會對在一個區域內的沃爾衣,進行 輪流發貨 的操作,比如這一次是靠近居民區的這家發貨,那下一次,就讓靠近商業區的沃爾衣發貨。”

“Soga!”

“用計算機術語來說,就是 Load Balancing ,負載均衡”

“呵呵,少扯這些術語,我只知道New Balance”

“哈哈,怎麼樣,微服務不是你想象的那樣吧,當然,在經濟學領域,要考慮的因素還有很多,現實生活中的沃爾茲依然是一個大百貨超市,自然是有它的道理的。微服務的應用主要是在更為純粹的計算機領域,也就是你看到的那些代碼”

“得了,看到那些頭就大,走,帶我去孃家拿行李”

“……”

對程序員的話

用了大白話,給老婆講明白了微服務的來龍去脈,當然,我還是有些話想說的,還是怕老婆聽完一臉懵逼,沒給她說:

1、

講微服務,就不得不從 單體應用 (Monolithic )講起。

所謂單體應用,就像一開始的沃爾茲百貨超市一樣,把所有業務的代碼都放在一起。這對於小型項目來說自然是很合適的,可是項目一旦大了起來,業務一多,這個單體也就 膨脹 了,膨脹後的單體應用主要有以下兩個缺點:

牽一髮而動全身 。我改了一個業務的一行代碼,需要重啟整個單體應用,這顯然不不合理的。就像珠寶店裝修時影響了旁邊的電器店,電器店著火時殃及珠寶店一樣。

只能水平擴展,不能縱向擴展 。對於單體應用,如果發現某一業務的請求量非常大,那麼是無法單獨擴展該業務的,只能拷貝整個單體應用,再部署一套環境,來實現集群。

正因為單體應用有著這些缺陷,才有了微服務。微服務和單體應用的區別,可以用Martin Fowler的這張圖來解釋:

如何給老婆解釋什麼是微服務?

2、

微服務雖然帶來了架構上的優勢,但同時也引入了 複雜性 。我們不得使用一些組件,來解決技術複雜性提高之後帶來的問題:

服務註冊中心 :一個服務可以有多個 實例 ,那麼我們在向一個服務發出請求的時候,怎麼知道這個服務有哪些實例呢?為了減少手工維護的麻煩,我們需要服務註冊中心。每個服務實例在啟動時,向註冊中心註冊自己的IP地址等信息。這樣,服務在調用別的服務的接口時,就可以通過註冊中心,查詢到其他服務的實例,向實例發起請求。沃爾茲總店就是起到註冊中心的作用。

負載均衡 :由於一個服務可以有多個實例,所以不管是來自外部客戶端的請求,還是微服務系統內部服務之間發起的請求,都需要引入負載均衡的機制,來發揮多實例集群的作用。有的書也稱這兩種負載均衡為 服務器端負載均衡 和 客戶端負載均衡 ,各自具有代表性意義的實現分別是Nginx和Ribbon。

API Gateway :一個外部請求過來之後,我們需要知道這個請求是發給哪個服務的,也就是我們需要一個 請求路由 的功能,比如/cm/的請求,要發給客戶管理服務,/om/的請求,要發給訂單管理服務。另外,不是所有請求都可以被我們系統處理的,我們需要判斷這個請求是否攜帶一些必要的鑑權信息,並對其進行鑑權,也就是 請求過濾 的功能。而API Gateway,就是起到了這兩個功能,它就像 整個微服務系統的門面 ,所有請求,都要先經過它的處理,才會轉發到對應的服務。

……

如何給老婆解釋什麼是微服務?

微服務系統的衍生組件還有很多,比如對各個服務進行的配置管理的分佈式配置中心、各個服務之間進行消息通訊的消息總線和消息驅動機制(上圖中的Message Queue)等,這裡就不一一列舉了。這篇文章只是想用一種比較有趣的方式,讓大家對微服務有一個初步的瞭解。就像學設計模式,如果直接去看四人幫的《設計模式——可複用面向對象軟件的基礎》,也許很多人學到一半就學不下去了,而如果先去看《Head First設計模式》,再去看前面那本書,也許就會發現輕鬆很多。

大家如果想對微服務有進一步的理解,我這邊首推Martin Fowler的 Microservices - a definition of this new architectural term ,微服務這個詞也是在這篇文章裡被首次提出,可以說是微服務的一手資料了。閱讀這篇著作,你可以:

對微服務的來源有更深入的瞭解,知道微服務這種設計模式,和Unix以及 康威定律 的關係;

看到微服務是如何影響軟件開發的 組織結構 的,其實也就是康威定律;

看到Martin Fowler總結的設計微服務系統的幾個原則;

從這篇著作底下的參考文獻,看到一些助推了微服務架構的 原始論文 。

架構這種東西,和設計模式非常相像,兩者都是針對某一類問題的解決方案。和設計模式一樣,每種架構都有其優點,當然也會有缺點。只有弄清楚為什麼要用這種架構,不用會怎樣,用了又會怎樣,知其然知其所以然,才能對架構進行靈活運用,在實際項目中發揮架構的優勢。


分享到:


相關文章: