微服務(wù)實(shí)踐目錄,可以參見連接。
0. 背景
0.1 拆分與控制的關(guān)系
微服務(wù)的邊界在服務(wù)劃分的方法中進(jìn)行說(shuō)明,拆分出服務(wù)之后需要對(duì)服務(wù)進(jìn)行管理和控制。服務(wù)之間的關(guān)系以及調(diào)用鏈的控制不會(huì)在服務(wù)拆分中進(jìn)行說(shuō)明。所以這里主要討論的是服務(wù)之間的關(guān)系。
0.2 管理服務(wù)之間關(guān)系的實(shí)踐方法
其實(shí)業(yè)界也有很多方法論可以用來(lái)管理服務(wù)之間的關(guān)系,例如:可以用DDD中的限界上下文映射可以作為服務(wù)間關(guān)系的理論基礎(chǔ),也可以用AKF中的Y軸的按照功能進(jìn)行切割,也可以用分層架構(gòu)中的層次來(lái)管理服務(wù)之間的關(guān)系。
下面主要討論兩種管理服務(wù)之間關(guān)系的方式:
-
分層模式
以定義層次意義的方式將服務(wù)劃分到不同的層次中。服務(wù)落到層次中之后就可以以層次關(guān)系來(lái)定義服務(wù)之間的關(guān)系。 -
分群模式
以服務(wù)群的邊界定義,使用多個(gè)服務(wù)組合成一個(gè)服務(wù)群。以群的邊界關(guān)系定義服務(wù)之間的關(guān)系。
1. 分層模式(中臺(tái))
1.1 概念
在架構(gòu)風(fēng)格中有分層架構(gòu)風(fēng)格,在DDD中也有分層模型。分層模式是應(yīng)用各種場(chǎng)景最直接,也是最容易上手的方式。就像在0.2中說(shuō)的那樣,只要定義清楚分層中每一層的作用即可定義服務(wù)之間的關(guān)系。
可以以自上而下的設(shè)計(jì)方法:對(duì)層的責(zé)任進(jìn)行定義,然后在定義服務(wù)。也可以先進(jìn)性服務(wù)拆分,然后根據(jù)服務(wù)所提供的內(nèi)能力在進(jìn)行分層。例子中可以看出這兩種方式的區(qū)別。
1.2 例子
DDD分層架構(gòu)
DDD分層架構(gòu)并不是只指DDD定義的分層,也可以是DDD分層引申出的六邊形架構(gòu),洋蔥架構(gòu),清晰架構(gòu)等等。他們都有一個(gè)特點(diǎn)是以先結(jié)論后細(xì)節(jié)的方式對(duì)層次進(jìn)行劃分。每一層都是下層的一個(gè)總結(jié)流程,每一層都是上層的能力的提供。中臺(tái)
中臺(tái)模式是以中臺(tái)能力為核心的。但是在建設(shè)過(guò)程中不可能知道哪些能力是需要中臺(tái)進(jìn)行承載的。所以,中臺(tái)是一個(gè)對(duì)前臺(tái)和后臺(tái)提供能力的一個(gè)部分,但是它的建設(shè)過(guò)程是需要不斷的抽象與總結(jié)來(lái)形成中臺(tái)能力的。
1.3 特點(diǎn)
公用能力
每一層都是向上層提供能力的。所以,下層的服務(wù)能力對(duì)于上層來(lái)說(shuō)就是公用的。縱向切割的分層模式
分層幾乎都是從上之下,或者從下至上的。有明確的層與層的依賴關(guān)系
上下層之間關(guān)系明確,下層向上層提供服務(wù)。不允許下層調(diào)用上層未對(duì)同層中的服務(wù)的能力進(jìn)行規(guī)范
粗粒度的服務(wù),細(xì)粒度的服務(wù)都在同一個(gè)層中。如果服務(wù)較多時(shí)可能分不清服務(wù)之間的劃分原則。故障隔離的方式使用調(diào)用鏈隔離的方式進(jìn)行隔離
使用上下層調(diào)用鏈的方式進(jìn)行隔離。
1.4 總結(jié)
有點(diǎn)很明顯,簡(jiǎn)單易上手并且公共能力提供比較好。缺點(diǎn)也很明顯,服務(wù)一多之后就很難管理了。
2. 分群模式(子系統(tǒng))
2.1 概念
以貼合團(tuán)隊(duì)管理的方式進(jìn)行服務(wù)的劃分工作,這里就可以很好的服務(wù)康威定律和逆康威定律。一個(gè)團(tuán)隊(duì)負(fù)責(zé)整體系統(tǒng)中的一部分業(yè)務(wù),而業(yè)務(wù)與業(yè)務(wù)之間有著天然的隔離能力。
2.2 例子
-
openstack中的分群
在openstack的架構(gòu)中很容易就可以看到,每一個(gè)部分是由一群服務(wù)來(lái)完成的。有專門對(duì)外提供能力的,有專門處理業(yè)務(wù)的,有負(fù)責(zé)存儲(chǔ)的。這一群服務(wù)來(lái)完成一個(gè)業(yè)務(wù)模塊。
2.3 特點(diǎn)
隔離性強(qiáng)
將所有非本群中的服務(wù)都認(rèn)為是第二方服務(wù)。然后以管理第二方的方式對(duì)外進(jìn)行管理工作。這樣故障基本上就可以隔離在服務(wù)群內(nèi)部。服務(wù)群之間的業(yè)務(wù)邊界明顯
服務(wù)群之間的業(yè)務(wù)是有著明顯的邊界的,如果邊界模糊或邊界不清晰就可以將兩個(gè)團(tuán)隊(duì)合并。但在分層模式中很難進(jìn)行層次之間的合并。服務(wù)群管理可以交給一個(gè)團(tuán)隊(duì)完成
服務(wù)群可以更貼近業(yè)務(wù)的方式對(duì)服務(wù)進(jìn)行劃分,所以,業(yè)務(wù)相近的服務(wù)交給一個(gè)團(tuán)隊(duì)比較合適。無(wú)法很好的定義服務(wù)群之間的協(xié)作關(guān)系
具體是服務(wù)群A給服務(wù)群B提供基礎(chǔ)能力,還是服務(wù)群B向服務(wù)群A提供業(yè)務(wù)能力。很難進(jìn)行定義。但在分層中,層次關(guān)系就定義了能力的提供方向。
2.4 總結(jié)
服務(wù)群能很好的進(jìn)行業(yè)務(wù)團(tuán)隊(duì)之間的隔離,但能力的公用就很難在服務(wù)群中被解決。
3. 總結(jié)
其實(shí)還有一種模式未進(jìn)行討論:微服務(wù)大泥球。即服務(wù)之間是平等的,任何服務(wù)都可以調(diào)用任何其他服務(wù)。這樣存在著比較大的問(wèn)題:調(diào)用鏈無(wú)法進(jìn)行管理,故障無(wú)法進(jìn)行隔離。所以,這里不討論這種方式。
其實(shí)這兩種服務(wù)間關(guān)系的管理方式很多時(shí)候也是混用的,并不必要在一個(gè)系統(tǒng)中只用一種模式。這個(gè)就需要架構(gòu)師來(lái)判斷哪些地方使用那種,在不同的地方使用不同的模式即可。
4. 參考
openstack logical architecture
[ 翻譯 ] 微服務(wù)架構(gòu)及設(shè)計(jì)模式