一個(gè)應(yīng)用,拆分為多個(gè)小服務(wù),這樣的架構(gòu)方式,就是微服務(wù)架構(gòu)
微服務(wù)核心要素
微服務(wù)架構(gòu)實(shí)例
我們拿一個(gè)電商貸款場(chǎng)景(如京東白條)劃分微服務(wù)舉例,以便后面的描述。 購(gòu)買(mǎi)場(chǎng)景主要有如下關(guān)鍵服務(wù)。
- 賬戶服務(wù):負(fù)責(zé)管理用戶基本信息,如姓名,性別,身份證等
- 額度服務(wù):用戶所能使用的額度。
- 支付服務(wù):負(fù)責(zé)完成支付操作。
- 賬單服務(wù):指定時(shí)間生成賬單給用戶。
- 風(fēng)控服務(wù):通過(guò)數(shù)據(jù)分析,管理用戶操作權(quán)限。
我們一開(kāi)始設(shè)計(jì)出如下圖的服務(wù)架構(gòu):
對(duì)比的微服務(wù)的標(biāo)準(zhǔn): 符合單獨(dú)部署; 符合進(jìn)程獨(dú)立; 服務(wù)間通信使用rpc,符合輕量級(jí)。
專(zhuān)注于一件事這一點(diǎn),看起來(lái)是符合,但是我們結(jié)合兩個(gè)實(shí)際流程:
支付流程:
注冊(cè)流程:
我們可以看到,除了微服務(wù)本身的邏輯,在具體流程下,部分微服務(wù)還要考慮如何和別的服務(wù)串起來(lái),也就是說(shuō),原有的邏輯層,并未消失,而是分散到了各個(gè)微服務(wù),職責(zé)并不單一!
于是架構(gòu)進(jìn)化:
可以看到,多了一層聚合層。專(zhuān)門(mén)負(fù)責(zé)聚合領(lǐng)域?qū)拥臄?shù)據(jù),對(duì)外提供接口。而領(lǐng)域?qū)拥奈⒎?wù),只用承擔(dān)好自己領(lǐng)域的職責(zé),提供出獨(dú)立,通用的服務(wù)接口。但在業(yè)務(wù)擴(kuò)展的過(guò)程中,我們發(fā)現(xiàn)聚合層業(yè)務(wù)越來(lái)越重,于是乎,我們需要繼續(xù)演進(jìn):
聚合層也做了拆分,于是,領(lǐng)域?qū)邮且唤M微服務(wù),聚合層是一組微服務(wù),職責(zé)清晰。聚合層劃分通常可以考慮到實(shí)際業(yè)務(wù)的前端界面,頁(yè)面為最小粒度來(lái)考慮聚合層微服務(wù),不失為一個(gè)參考辦法,即一個(gè)頁(yè)面或者幾個(gè)頁(yè)面為一個(gè)微服務(wù)。
微服務(wù)的優(yōu)勢(shì)與劣勢(shì)
五年前加入騰訊時(shí)還是使用典型的logic-server架構(gòu),后面微服務(wù)如燎原之火,成了新的主角。后續(xù)經(jīng)歷的上市外企,tmd中的一家,微服務(wù)也是大行其道。也時(shí)常思考微服務(wù)的必要性。
微服務(wù) 優(yōu)點(diǎn):
- 模塊小而獨(dú)立,方便新人上手;
- 發(fā)布時(shí)候,只發(fā)布對(duì)應(yīng)的微服務(wù),減少依賴和查錯(cuò)成本。
- 由于拆分得比較細(xì),重構(gòu)時(shí)不容易背太大的技術(shù)債務(wù)。
- 新的微服務(wù)中,可以大膽使用新技術(shù),不受原有模塊的制約。
缺點(diǎn)
- 容易只關(guān)注自己一畝三分地,對(duì)整體把握不足。
- 微服務(wù)真正的難點(diǎn)在于劃分,如果劃分不當(dāng),那么服務(wù)存在耦合,比如一些狀態(tài)信息,是服務(wù)b管理,但是服務(wù)a又十分需要,此時(shí)無(wú)論是通知還是輪詢,都是很麻煩的事。
- 一個(gè)完整數(shù)據(jù),可能需要從多個(gè)服務(wù)反復(fù)獲取,如果存在層級(jí)關(guān)系,可能一個(gè)請(qǐng)求就導(dǎo)致幾十個(gè)rpc。
- 后臺(tái)開(kāi)發(fā)中每個(gè)其他服務(wù)都是不可信的,都需要做錯(cuò)誤處理,那此時(shí)聚合層如果調(diào)用5個(gè)領(lǐng)域服務(wù)成功,一個(gè)領(lǐng)域失敗,拋出錯(cuò)誤還是降級(jí)服務(wù),也是個(gè)讓人得具體思考的問(wèn)題。