建模:确定服务的边界——《微服务设计》读书笔记
什么樣的服務(wù)才是好的服務(wù)?
? ? ??高內(nèi)聚、松耦合的服務(wù)才是好的服務(wù)。簡(jiǎn)而言之,就是把相關(guān)性強(qiáng)的放在一起,相關(guān)性不強(qiáng)的分開,物以類聚,人以群分,服務(wù)的劃分也是這樣。這就需要確定什么要放在一起,什么是要分開的,這個(gè)尋找的過(guò)程就是確定服務(wù)邊界的過(guò)程。
?
限界上下文
? ? ? ?限界上下文確定了這個(gè)邊界內(nèi)它所承擔(dān)的職責(zé)。
? ? ? Evans在《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中作喻:細(xì)胞之所以會(huì)存在,是因?yàn)榧?xì)胞膜定義了什么在細(xì)胞內(nèi),什么在細(xì)胞外,并且確定了什么物質(zhì)可以通過(guò)細(xì)胞。這是限界上下文的絕好比喻。
? ? ? 任何一個(gè)給定的領(lǐng)域都包含多個(gè)限界上下文。限界上下文中包含了一些內(nèi)容(或者叫模型),它們的相關(guān)性較高,一部分需要與外部通信,一部分不需要與外部通信,每個(gè)限界上下文都有明確的接口,該接口決定了它會(huì)暴露哪些模型給其他的上下文。外部想與限界上下文通信,需要使用模型和它的顯式限界(接口)進(jìn)行通信。這樣做可以得到高內(nèi)聚,從而很好地形成組合限界。
? ? ? 限界與限界之間,也會(huì)存在共享模型,如下所示,倉(cāng)庫(kù)和財(cái)務(wù)都需要庫(kù)存信息,但不能把倉(cāng)庫(kù)所有的庫(kù)存信息都給財(cái)務(wù),因?yàn)橛行┬畔?duì)于財(cái)務(wù)是并沒(méi)有用的,同時(shí)也不能讓財(cái)務(wù)伸到倉(cāng)庫(kù)內(nèi)部去取數(shù)據(jù),這樣有可能會(huì)破壞限界上下文的完整性,因此,我們提供了一個(gè)共享模型——庫(kù)存項(xiàng)。
? ? ? ? ? ? ? ? ??
? ??? 這些模塊限界就可以成為絕佳的微服務(wù)候選,一般來(lái)說(shuō),微服務(wù)應(yīng)清晰地和限界上下文保持一致。
?
如何確定限界上下文
??? ??1.推薦使用領(lǐng)域來(lái)表分解限界上下文
? ? ? 如果把系統(tǒng)分解成為限界上下文來(lái)表示領(lǐng)域的話,那么對(duì)于某個(gè)功能所做的修改,就更傾向于在一個(gè)單獨(dú)的微服務(wù)限界之內(nèi)。另外,服務(wù)之間應(yīng)該共享相同的術(shù)語(yǔ),也應(yīng)該反映到服務(wù)的接口上。
? ? ??2.應(yīng)從限界上下文提供的功能來(lái)考慮,而不是數(shù)據(jù)
只考慮數(shù)據(jù)和模型,不考慮上下文的功能,很容易導(dǎo)致“貧血”,所以要先問(wèn)“這個(gè)上下文是做什么用的“,再考慮它”需要什么樣的數(shù)據(jù)“。
? ? ??3.不要過(guò)早劃分上下文
? ? ? 對(duì)于一個(gè)新系統(tǒng)而言,可以先使用一段時(shí)間的單塊系統(tǒng),因?yàn)槿绻?wù)之間的限界搞錯(cuò)了,后面修復(fù)的代價(jià)就會(huì)很大,所以最好能夠等到系統(tǒng)穩(wěn)定下來(lái)之后,再確定把哪些東西作為一個(gè)服務(wù)劃分出去。
? ? ??4.不要排斥嵌套上下文
? ? ???一開始,你會(huì)識(shí)別一些粗粒度的限界上下文,而這些限界上下文可能又包含一些嵌套的限界上下文。如下所示:使用這些嵌套的上下文不直接對(duì)外可見(jiàn),對(duì)于外界來(lái)說(shuō),它們用的還是倉(cāng)庫(kù)的功能,但發(fā)出的請(qǐng)求其實(shí)被透明地映射到了兩個(gè)或更多有服務(wù)上。
? ? ? ? ? ? ? ?
? ? ??當(dāng)然,根據(jù)每個(gè)團(tuán)隊(duì)的情況不同,我們也可以將倉(cāng)庫(kù)的內(nèi)的上下文再隔離出來(lái),如下所示:
? ? ? ? ? ? ??
? ??? 5.謹(jǐn)慎根據(jù)技術(shù)邊界來(lái)確定上下文
? ? ? 一般而言,我們建議按照業(yè)務(wù)的垂直劃分來(lái)建立上下文,而不是按照技術(shù)的分層來(lái)確定上下文,比如,你如果將DAO、BLL、UI層分成3個(gè)不同的服務(wù),那么當(dāng)你需要變更業(yè)務(wù)的時(shí)候,你需要頻繁地同時(shí)修改兩個(gè)服務(wù),這樣顯然是不合理的。但也不是說(shuō)這樣劃分總是不合理,如果一個(gè)組織想達(dá)到某個(gè)性能目標(biāo),這樣劃分反而更合理。
? ? ??
參考
? ? ? 《微服務(wù)設(shè)計(jì)》(Sam Newman 著 / 崔力強(qiáng) 張駿 譯)
相關(guān)文章:?
微服務(wù)的概念——《微服務(wù)設(shè)計(jì)》讀書筆記
微服務(wù)架構(gòu)師的職責(zé)——《微服務(wù)設(shè)計(jì)讀書筆記》
原文地址:http://www.cnblogs.com/gudi/p/6613989.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的建模:确定服务的边界——《微服务设计》读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解C# 4 dynamic(1) -
- 下一篇: 微服务集成——《微服务设计》读书笔记