上一篇文章我們從「儲存選型」角度學習了架構師的基本能力。
今天將從儲存的上一層「服務維度」學習架構師的第二項常用能力——微服務設計與治理。
這是我們對微服務進行架構設計過程中非常關注的兩個問題。
本文對微服務的生命週期定義了七個階段,如下圖所示。
圍繞這七個階段總結了16條常用原則。
康威定律:Conway’s law: Organizations which design systems[…] are constrained to produce designs which are copies of the communication structures of these organizations.
(設計系統的組織,其產生的設計和架構等價於組織間的溝通結構。)
組織的溝通和系統的設計之間緊密相連,特別是複雜系統,解決好人與人的溝通才能有一個更好的系統設計。
《人月神話》中總結出了隨著人員的增加溝通成本呈指數增長的規律:溝通成本 = n(n-1)/2。舉例說明:
系統越複雜,人手越多,溝通成本也呈指數增長。因此,分而治之便是大多數公司選擇的解決方案。分不同的層級,分不同的小團隊,讓團隊內部完成自治理。
領域驅動設計是微服務領域的熱門話題,本文不展開說明,僅說明幾點重要事項:
原則2與原則1的區別在於,原則1關注組織架構領域,原則2更偏向軟體工程設計領域。
所謂單一職責原則,就是對一個服務而言,它的功能要單一,只做與它相關的事情。
在微服務的設計過程中要按職責進行設計,彼此保持正交,互不干涉。
什麼樣的單一領域物件的單一職責微服務才是有價值的?就是不斷有業務變化,能夠維持業務永續性,有業務生命力的領域物件。舉例來說:
那麼就很有價值獨立為一個微服務,實現獨立演進、個性化的彈性伸縮。
所以,我們在進行微服務設計時,要能夠分析、預測出需求變化的點在哪裡?高並行的點在哪些?資料增長的位置在哪裡?與DDD分析相結合,找出最有價值的那個單一職責,進行合理、適度的領域、子領域、有界上下文分解,才能更好的應對複雜的業務、不斷變化的業務。
過度追求「單一職責」,或者拆分微服務過細,往往會帶來不良後果。微服務的設計並不是越細越好,過度拆分會導致呼叫效能變差、資料一致性難以保障、系統可用性降低等問題。
因此,「高內聚」原則要求:
什麼是「狀態」?如果一個資料需要被多個服務共用,才能完成一筆交易,那麼這個資料被稱為狀態。
依賴這個「狀態」資料的服務被稱為有狀態服務,反之稱為無狀態服務。
「無狀態」原則並不是說在微服務架構裡就不允許存在狀態,而是要把有狀態的業務服務改變為無狀態的計算類服務,那麼狀態資料也就相應的遷移到對應的「有狀態資料服務」中。
場景說明:例如我們以前在本地記憶體中建立的資料快取、Session快取,到現在的微服務架構中就應該把這些資料遷移到分散式快取中儲存,讓業務服務變成一個無狀態的計算節點。遷移後,就可以做到按需動態伸縮,微服務應用在執行時動態增刪節點,就不再需要考慮快取資料如何同步的問題。
只有服務無狀態,才能實現快速彈性擴縮容,應對流量峰谷。
接入高可用中介軟體(如sentinal),實現限流、熔斷、降級,增強可用性
除了預設系統監控外,微服務需要梳理並定義必要的「業務監控指標」。
微服務相關設定需要統一接入設定中心進行管理、控制。
只做單向呼叫,避免迴圈呼叫。
多個服務迴圈依賴呼叫形成集中式「分散式大單體」,違背微服務的原則。
按需接入訊息佇列,實現「依賴解耦」、「流量削峰」
儘量設計BFF層,把前端的特殊需求交給BFF層,使後端服務邏輯具有高內聚、高複用性的精簡核心邏輯。
保證「可灰度」、「可監控」、「可回滾」。
「架構腐化」的常見場景:
「水平擴容」比較容易理解,直白點說就是加機器。根據AKF模型,除了加機器外,我們還可以考慮「功能拆分」或者 「資料分割區」。
「功能拆分」相對複雜,一般包括幾種模式:
「資料分割區」往往指的是資料庫層面。需要引入資料庫中介軟體,像 sharding-jdbc、mycat 等,在資料層面需要設定相應的分片邏輯。正確的拆分對提高系統的容量有很大的幫助,失敗的拆分可能會造成熱點集中,得不償失。常用的分割區邏輯包括 按照時間分割區、按照使用者id取模分割區等。
清理無效程式碼、環境,減少維護成本。同時釋放資源,節約成本。
架構師在進行微服務設計和微服務治理時,可以圍繞微服務生命週期的七個階段展開。
本文總結了16條常用原則,希望能提供一些思路和啟發。
如果你有其他補充和建議,歡迎留言討論。
都看到最後了,原創不易,點個關注,點個贊吧~
文章持續更新,可以微信搜尋「阿丸筆記 」第一時間閱讀,回覆【筆記】獲取Canal、MySQL、HBase、JAVA實戰筆記,回覆【資料】獲取一線大廠面試資料。
知識碎片重新梳理,構建Java知識圖譜:github.com/saigu/JavaK…(歷史文章查閱非常方便)