程式設計師抗卷指南之:如何進行服務模組拆分(架構師方法經驗乾貨)

前面已經講到了系統高層架構設計落地的第一步,確定系統邊界。

接下來具體地看看系統高層架構設計落地的第二步:如何進行服務拆分,這也是很多新手架構師犯怵的地方,一起來看看吧。

一:服務是什麼

程式設計師抗卷指南之:如何進行服務模組拆分(架構師方法經驗乾貨)

這裡說的服務,可以看作是一定功能集的聚合封裝體,並不一定特指微服務,也可以類比為子系統。

從系統設計的角度,或者是設計思維上,服務的本質就是一些功能集合的這麼一個封裝體。

因此從設計上來說,系統、子系統、模組、元件等,本質都是一樣的,都是一定功能的封裝體,只不過功能集的範圍大小不一樣。

一般我們認為,系統比子系統大,子系統比模組大,模組比元件大,但是從設計層面來看,它們本質都是一樣的。

前面講的確定系統邊界,是站在系統外部來看待整個系統,去理解系統要做什麼和不做什麼,以及系統和相關係統的互動關係等。

當視角從系統外轉向系統內部時,首先要做的,就是內部子系統、模組、元件等的劃分,其實本質都是對功能進行聚集,然後把這些相關的功能集進行聚合封裝,也就是我們這裡說的服務。

二:服務的基本要求

程式設計師抗卷指南之:如何進行服務模組拆分(架構師方法經驗乾貨)

1:服務功能是自包含的

自包含的意思就是:一個服務需要的功能,應該儘量都包含在服務之內。

當然,這個做不到絕對,雖然每個服務都是一個封裝體,但有些功能,它也需要跟其它服務或外部系統去互動。

因此,只能是儘可能的自包含,就跟我們做設計,耳熟能詳的那句話:“加強內聚,鬆散耦合”一樣,對服務來講,功能的自包含,其實就是加強內聚的體現。

2:服務具備獨立性和專業性

所謂獨立性,指的是一個服務應該加強內聚,功能上獨立;另外一個就是服務能夠獨立部署、獨立執行,這是服務獨立性的兩層含義。

所謂專業性,指的是按照垂直、專業的方式來聚合功能,比如搜尋服務,就是把搜尋相關的功能劃分到一個服務;又比如支付服務,就是把跟支付相關的功能包裝成一個服務,等等的。

3:服務之間應該松耦合

這個大家好理解,簡單來說,就是一個服務內部的變化,不能影響呼叫服務的客戶端。也就是服務之間,應該是鬆散耦合的,可以隨時對服務升級,或者是切換不同的服務實現。

4:服務通常是無狀態的

這個是目前大家設計上的一個共識,就是在服務端這邊,不會去保留客戶端的狀態(就是指資料),也就是服務是無狀態的,不管哪個客戶端來,都是一樣的執行功能。

5:服務間採用輕量級的通訊機制

目前來說,主要是兩大派,一派是htt加p/s協議 + Restful 的形式,比如Spring Cloud;另一派主要是RPC,比如Dubbo、Thrift等。

三:服務拆分的基本方法

程式設計師抗卷指南之:如何進行服務模組拆分(架構師方法經驗乾貨)

1:按AKF進行服務拆分

對於AKF不瞭解不熟悉的朋友,我們在下一篇來講述一下AKF擴充套件立方體。

2:按業務功能進行橫向和縱向拆分

所謂橫向拆分,就是按照不同的業務領域、或者是專業性 來進行拆分,比如按業務領域把系統分為:使用者服務、商品服務、訂單服務 等;從專業的角度,分出:搜尋服務、支付服務等。

所謂縱向服務,就是在橫向拆分的基礎上,對每個服務進行更細粒度的劃分。比如把商品服務繼續細化,拆分成為:實物商品服務、虛擬商品服務、福利商品服務、O2O商品服務等等的。

3:服務分層拆分

比如大家熟知的,前後端服務分離,這本身就是一種分層的拆分形式。

就從後端來講,可能會有一個層次,是專門來為前端服務的,通常稱為聚合服務。

比如給系統平臺管理人員使用的一些功能,從服務實現上分散到很多服務裡面,但為了跟前端配合,我們通常會專門聚合出一個服務,把所有跟系統平臺管理人員相關的功能,都聚合到一起。

聚合服務這一層會向下去呼叫真正的業務服務實現,業務服務下面又有公共的基礎服務做支撐,你看,這樣是不是就自然的形成服務的分層拆分。

4:為效能進行服務拆分

如果拆分了服務過後,感覺效能達不到要求,我們可能會進一步拆分服務,以滿足效能的需求。

比如秒殺系統,它本來應該是促銷服務裡面的一部分,但是呢,由於秒殺系統對系統性能要求比較高,會涉及到高併發、高可用等的處理。

所以我們通常會把秒殺系統單獨拆分出來,成為一個獨立的服務,但對對它進行處理和最佳化,也把它和業務系統分開,避免因為做活動而把業務系統拖垮。

5:為安全進行服務拆分

這個也比較常見,比如我們考慮到,需要一些公共的授權和鑑權的功能,我們會把賬號體系、認證體系獨立出來,把它放到閘道器去進行統一的處理。

又比如跟業務相關的一些安全處理,比如統一的安全管控,控制同一個IP呼叫的次數、呼叫的頻率、試錯的次數 等等的,也會把它們拆分出來,做成一個單獨的服務。

進一步,就是對業務的一些風險管控,比如風控系統,也會拆分出來形成單獨的服務。

這些都是為了安全進行的服務拆分。

6:為重用進行服務拆分

當我們進行細節實現思考的時候,可能會發現,出現了多個服務都需要的功能,我們就需要把這些功能拆分出來,形成獨立的、公共的服務,供這多個服務使用。

這就跟我們發現多個類裡面有相同或者類似的功能實現的時候,會把它們提煉出來,做到公共的模組裡面去,一樣的道理。

如果這些功能跟業務不相關的話,會進一步把它們封裝到基礎服務裡面去。這都是為了重用而進行服務拆分的方式。

到這裡,如何進行服務拆分就講得差不多了。

有問題或者意見、建議,請評論留言或者私信,大家一起探討,一起進步!

當然,如果你覺得本系列文章還不錯,能夠給你一些啟發和思考的話,請關注、點贊、收藏加轉發,讓更多的朋友加入到我們的行列,謝謝啦!

更多架構師之路乾貨文章,已在路上,稍後就到!

程式設計師抗卷指南之:如何進行服務模組拆分(架構師方法經驗乾貨)