對于一個(gè)大系統(tǒng),應(yīng)該從什么角度進(jìn)行微服務(wù)拆分?
首先我們要確定出微服務(wù)的大致數(shù)量,數(shù)量很關(guān)鍵,因?yàn)閿?shù)量越多,維護(hù)成本越大,一定不要超出團(tuán)隊(duì)的承受范圍。確定了數(shù)量,我們再考慮怎么拆。
服務(wù)粒度
最好是基于團(tuán)隊(duì)的規(guī)模進(jìn)行拆分,以1個(gè)微服務(wù)由3個(gè)人開發(fā)最佳,例如團(tuán)隊(duì)開始有6個(gè)人,就可以劃分為2個(gè)微服務(wù),隨著業(yè)務(wù)的發(fā)展,功能越來越多,團(tuán)隊(duì)擴(kuò)充到了12個(gè)人,就可以把原來的2個(gè)拆為4個(gè)。
3個(gè)人的好處:
- 3個(gè)人負(fù)責(zé)一個(gè)微服務(wù),每人對系統(tǒng)的理解程度、分工的粒度、系統(tǒng)的效率都是非常合適的。
- 從管理的角度來看,3個(gè)人是非常穩(wěn)定的結(jié)構(gòu),即使1個(gè)人休假或者調(diào)走,剩余2個(gè)人還可以支撐。如果一共是2個(gè)人,走一個(gè)剩一個(gè)的話壓力就很大了。
- 從技術(shù)提升的角度,3個(gè)人能夠有效的討論,快速達(dá)成一致,提升很快。如果是2個(gè)人,可能互相堅(jiān)持自己的意見。如果是4個(gè)人,可能有的人不會認(rèn)真參與討論。
拆分方法
1. 基于業(yè)務(wù)邏輯拆分
- 將系統(tǒng)中的業(yè)務(wù)模塊按照職責(zé)范圍識別出來,每個(gè)單獨(dú)的業(yè)務(wù)模塊拆分為一個(gè)獨(dú)立的服務(wù)。
- 例如,做一個(gè)電商系統(tǒng),可以劃分為商品、交易、用戶3個(gè)服務(wù),也可以劃分為商品、訂單、支付、發(fā)貨、買家、賣家6個(gè)服務(wù)。
- 這2種劃分都沒問題,差異就是數(shù)量不同,這時(shí)就要根據(jù)上面拆分粒度的原則了,根據(jù)團(tuán)隊(duì)規(guī)模來決定。所以,我們要先計(jì)算大概的服務(wù)數(shù)量,然后再確定合適的“職責(zé)范圍”。
2. 基于可擴(kuò)展拆分
- 將系統(tǒng)中的業(yè)務(wù)模塊按照穩(wěn)定性排序,將已經(jīng)成熟和改動不大的服務(wù)拆分為穩(wěn)定服務(wù),將經(jīng)常變化和迭代的服務(wù)拆分為變動服務(wù)。
- 穩(wěn)定服務(wù)的粒度可以粗一些,即使邏輯上關(guān)聯(lián)不強(qiáng)的也可以放在一個(gè)服務(wù)中,例如日志服務(wù)、升級服務(wù)放在一個(gè)子系統(tǒng)中。
- 變動服務(wù)的粒度可以細(xì)一些,但要注意服務(wù)的數(shù)量。
- 這種拆分方式是為了提升項(xiàng)目快速迭代的效率,避免變動服務(wù)的改動升級影響了成熟的功能。
3. 基于可靠性拆分
將系統(tǒng)中的 可靠性要求高的核心服務(wù) 和 可靠性要求低的非核心服務(wù) 拆分開來,然后重點(diǎn)保證核心服務(wù)的高可用。
好處:
- 避免非核心服務(wù)故障影響核心服務(wù)
例如,日志上報(bào)是非核心服務(wù),某一段時(shí)間內(nèi)上報(bào)量可能會非常大,如果沒有拆分出來,那么就可能嚴(yán)重影響核心服務(wù)。 - 核心服務(wù)高可用方案更簡單
核心服務(wù)單獨(dú)拆分出來后,涉及的數(shù)據(jù)、組件等都會更少,對其做高可用方案就簡單很多,需要考慮的點(diǎn)較少。 - 降低高可用成本
拆分后,核心服務(wù)占用的機(jī)器、帶寬等資源比不拆分要少很多。
4. 基于性能拆分
- 將對性能壓力大的模塊拆出來,避免影響其他服務(wù),而且對其做性能提升、高可用等優(yōu)化都更簡單高效。
- 例如電商的搶購,排隊(duì)功能的性能壓力很大,就可以將其獨(dú)立為一個(gè)服務(wù)。
小結(jié)
注意,這幾種拆分方式不是多選一,可以根據(jù)實(shí)際情況自由組合,例如一個(gè)系統(tǒng)X,可以基于可靠性拆分出服務(wù)A,基于性能拆分出B,基于可擴(kuò)展性拆出 C/D/F,最后共 A/B/C/D/F/X 6個(gè)服務(wù)。
image