微服務劃分的姿勢

2022-01-10 21:30:05 字數 3373 閱讀 6963

我們知道微服務是一種理念,沒有確切的定義和邊界,好比設計原則,是屬於抽象的概念。在定義不明確的情況下談劃分也是一種各說各話,具體問題需要具體分析,所以這篇文章談到的劃分也不是絕對標準,僅供參考。

有人說微幅不難,難的是服務的劃分,雖然我持保留意見。但是從側面也反應了劃分具有一定的困難。這裡的矛盾在於粒度。如果粒度太大了,分和不分似乎都差不多;如果粒度太小了,聚合、發布、呼叫鏈、除錯等都是坑。

以下談到的拆分是前人經驗的總結,我羅列了三種行家的拆分姿勢,每個的的經驗和視野不同,各有偏頗,我在這裡更多的是談共鳴和感受,希望對你有所啟發。

1.1 縱向拆分

業務維度進行拆分。標準是按照業務的關聯程度來決定,關聯比較密切的業務適合拆分為乙個微服務,而功能相對比較獨立的業務適合單獨拆分為乙個微服務。

1.2 橫向拆分

從公共且獨立功能維度拆分。標準是按照是否有公共的被多個其他服務呼叫,且依賴的資源獨立不與其他業務耦合。

縱向以業務為基準,關係鐵的在一起;橫向功能獨立的在一起。我想如果拆分這麼簡單,你有底氣拆,敢拆嗎?所以我們又繼續比對一下其他專家的言論。

阿里的小夥伴從綜合的維度來看,部分維度和上面會有重合。

2.1 服務拆分要迎合業務的需要

充分考慮業務獨立性和專業性,避免以團隊來定義服務邊界,從而出現「土匪」搶地盤,影響團隊信任。

這個維度和上面的類似,但是強調的是業務和團隊成員的各自獨立性,對上面是一種很好的補充。

2.2 拆分後的維護成本要低於拆分前

這裡的維護成本包括:人力、物力、時間。

這裡的成本對大部分中小團隊來說都是必須要考慮的重要環節,如果投入和收益不能成正比,或者超出領導的預算或者市場視窗,那麼先進的技術就是絆腳石,千萬不要迷戀技術,所謂工程師思維千萬要不得。

2.3 拆分不僅僅是架構的調整,組織結構上也要做響應的適應性優化

確保拆分後的服務由相對獨立的團隊負責維護。

這句話怎麼理解呢?傳統的團隊劃分是按照產品部、前端、後端橫向劃分,微服務化以後的團隊可能就會是吃一張披薩餅的人數,產品、前端、後端被歸類到服務裡面,以服務為中心來分配人數。

2.4 拆分最有價值的結果是提高了系統的可擴充套件性

把具有不同擴充套件性要求的服務拆分出來,分別進行部署,降低成本,提高效率。比如全文搜尋服務。

這點和上面的按功能獨立性來拆分有點類似,功能獨立其實就是面向可擴充套件性。

2.5 考慮軟體發布頻率

比如把20%經常變動的部分進行抽離,80%不經常變動的單獨部署和管理。說白了就是按照8/2原則進行拆分。這個拆分的好處很明顯,可以盡可能的減少發布產生的後遺症,比如使用者體驗、服務相互干擾等。

但是這裡有乙個問題,假如20%的服務分屬於不同的業務層面,那該怎麼辦?所以這裡的拆分應該有個優先順序,在拆分相互衝突的時候應該要優先考慮權重比較高的那個。

資深技術專家李運華在他的架構書中給出的拆分:

3.1 基於業務邏輯

將系統中的業務按照職責範圍進行識別,職責相同的劃分為乙個單獨的服務。這種業務優先的方式在前面兩種姿勢當中都出現過,可見是最基本,最重要的劃分方式(沒有之一)。

3.2 基於穩定性

將系統中的業務模組按照穩定性進行排序。穩定的、不經常修改的劃分一塊;將不穩定的,經常修改的劃分為乙個獨立服務。比如日誌服務、監控服務都是相對穩定的服務,可以歸到一起。這個很類似上面提到的2/8原則,80%的業務是穩定的。

至此你會發現服務的拆分真的沒有絕對的標準,只有合理才是標準。

3.3 基於可靠性

同樣,將系統中的業務模組按照可靠性進行排序。對可靠性要求比較高的核心模組歸在一起,對可靠性要求不高的非核心模組歸在一塊。

這種拆分的高明可以很好的規避因為一顆老鼠屎壞了一鍋粥的單體弊端,同時將來要做高可用方案也能很好的節省機器或頻寬的成本。

3.4 基於高效能

同上,將系統中的業務模組按照對效能的要求進行優先順序排序。把對效能要求較高的模組獨立成乙個服務,對效能要求不高的放在一起。比如全文搜尋,商品查詢和分類,秒殺就屬於高效能的核心模組。

以上不同拆分姿勢各有千秋,異曲同工!

如果你把上面的劃分角度背下來了拿去現場套,可能還會遇到矛盾或爭議。

假如我們按照業務來劃分,根據粒度大小,可能存在以下兩種:

3 vs 6,這該怎麼辦?

如果你的團隊只有9個人,那麼分成3個是合理的,如果有18個人,那麼6個服務是合理的。這裡引入團隊成員進行協助拆分。

可見拆分的姿勢不是單選,而是多選的。這個時候必須要考慮團隊成員數量

在拆分遇到爭議的時候,一般情況下我們增加一項拆分條件,雖然不是充要條件,但至少我們的答案會更加接近真理。

除了業務可能存在爭議,其他的劃分也會有爭議,比如乙個獨立的服務到底需要多少人員的配置?

上面提到的人員數量配置,這裡為什麼是9和18呢?(這裡的團隊配置參考李雲華前輩提到的三個火槍手的觀點)

換一種問法,為什麼說是三個人分配乙個服務(當然,成員主要是後端人員)?

那麼這個3是不是就是穩定的數量呢?

假設你做的是邊開飛機邊換引擎的重寫工作,那麼前期3個人都可能捉襟見肘。但是到了服務後期,你可能1個就夠了。

所以3在我的理解應該是乙個基準線,不同的時間段會有上下波動,但是相對穩定。

微服務服務劃分示例

近年來微服務 soa很是流行,我們團隊趕時髦,也玩了玩。雖然用的時間還不長,但也已經踩過不少坑。今天想記錄下自己對邊界問題的一些思考。很多人在談起微服務時,總是會很自豪的說,微服務為我們提供了高內聚低耦合的明顯好處,因為微服務強化了模組化的概念。但是,如何模組化,如何明確的定義模組的邊界,卻很少有人...

如何劃分微服務

我們已經大概知道了微服務是什麼東西了,如果你還不知道的話,可以點這裡。這篇文章就主要了解一下怎麼去劃分微服務,確定服務邊界。首先這裡先介紹幾個概念。現在有一家面向c端使用者的公司,有自己的使用者服務和財務服務。那麼這兩個服務其實就是兩個單獨的限界上下文。都會提供一些對外的介面 使用者資訊,會員,支付...

微服務劃分原則

確切地說,服務中 的劃分原則更多的是架構設計經驗總結,我們很難對 些具體的問題給 個精確的量化指標,但有 點,我很反對現在微服務中的loc line of code 這種指標,即 的 數來衡量 個微服務落地的標準。架構本來就是 個追求平衡的藝術,不僅是設計原則上的平衡,還要在技術 成本 資源 效能 ...