天天看點

微服務設計為什麼要選擇DDD

軟體架構模式的演進

微服務設計為什麼要選擇DDD

微服務設計和拆分的困境

微服務拆分困境産生的根本原因就是不知道業務或者微服務的邊界到底在什麼地方。換句話說,确定了業務邊界和應用邊界,這個困境也就迎刃而解了。

DDD 核心思想是通過領域驅動設計方法定義領域模型,進而确定業務和應用邊界,保證業務模型與代碼模型的一緻性。

為什麼 DDD 适合微服務?

DDD 是一種處理高度複雜領域的設計思想,它試圖分離技術實作的複雜性,并圍繞業務概念建構領域模型來控制業務的複雜性,以解決軟體難以了解,難以演進的問題。DDD 不是架構,而是一種架構設計方法論,它通過邊界劃分将複雜業務領域簡單化,幫我們設計出清晰的領域和應用邊界,可以很容易地實作架構演進。

DDD 包括戰略設計和戰術設計兩部分。

戰略設計主要從業務視角出發,建立業務領域模型,劃分領域邊界,建立通用語言的限界上下文,限界上下文可以作為微服務設計的參考邊界。

戰術設計則從技術視角出發,側重于領域模型的技術實作,完成軟體開發和落地,包括:聚合根、實體、值對象、領域服務、應用服務和資源庫等代碼邏輯的設計和實作。

DDD 戰略設計會建立領域模型,領域模型可以用于指導微服務的設計和拆分。事件風暴是建立領域模型的主要方法,它是一個從發散到收斂的過程。它通常采用用例分析、場景分析和使用者旅程分析,盡可能全面不遺漏地分解業務領域,并梳理領域對象之間的關系,這是一個發散的過程。事件風暴過程會産生很多的實體、指令、事件等領域對象,我們将這些領域對象從不同的次元進行聚類,形成如聚合、限界上下文等邊界,建立領域模型,這就是一個收斂的過程。

微服務設計為什麼要選擇DDD

我們可以用三步來劃定領域模型和微服務的邊界。

第一步:在事件風暴中梳理業務過程中的使用者操作、事件以及外部依賴關系等,根據這些要素梳理出領域實體等領域對象。

第二步:根據領域實體之間的業務關聯性,将業務緊密相關的實體進行組合形成聚合,同時确定聚合中的聚合根、值對象和實體。在這個圖裡,聚合之間的邊界是第一層邊界,它們在同一個微服務執行個體中運作,這個邊界是邏輯邊界,是以用虛線表示。

第三步:根據業務及語義邊界等因素,将一個或者多個聚合劃定在一個限界上下文内,形成領域模型。在這個圖裡,限界上下文之間的邊界是第二層邊界,這一層邊界可能就是未來微服務的邊界,不同限界上下文内的領域邏輯被隔離在不同的微服務執行個體中運作,實體上互相隔離,是以是實體邊界,邊界之間用實線來表示。

DDD 與微服務的關系

DDD 是一種架構設計方法,微服務是一種架構風格,兩者從本質上都是為了追求高響應力,而從業務視角去分離應用系統建設複雜度的手段。兩者都強調從業務出發,其核心要義是強調根據業務發展,合理劃分領域邊界,持續調整現有架構,優化現有代碼,以保持架構和代碼的生命力,也就是我們常說的演進式架構。

DDD 主要關注:從業務領域視角劃分領域邊界,建構通用語言進行高效溝通,通過業務抽象,建立領域模型,維持業務和代碼的邏輯一緻性。

微服務主要關注:運作時的程序間通信、容錯和故障隔離,實作去中心化資料管理和去中心化服務治理,關注微服務的獨立開發、測試、建構和部署。

總體來說,DDD 可以給你帶來以下收獲:

  1. DDD 是一套完整而系統的設計方法,它能帶給你從戰略設計到戰術設計的标準設計過程,使得你的設計思路能夠更加清晰,設計過程更加規範。
  2. DDD 善于處理與領域相關的擁有高複雜度業務的産品開發,通過它可以建立一個核心而穩定的領域模型,有利于領域知識的傳遞與傳承。
  3. DDD 強調團隊與領域專家的合作,能夠幫助你的團隊建立一個溝通良好的氛圍,建構一緻的架構體系。
  4. DDD 的設計思想、原則與模式有助于提高你的架構設計能力。
  5. 無論是在新項目中設計微服務,還是将系統從單體架構演進到微服務,都可以遵循 DDD 的架構原則。
  6. DDD 不僅适用于微服務,也适用于傳統的單體應用。

繼續閱讀