文章目錄
- DDD(Domain Driving Design)領域驅動開發
- 1、微服務設計為什么選擇DDD
- 1、架構對比
- 2、微服務的問題
- 3、戰略設計(業務層面-業務架構)
- 4、戰術設計(技術層面-系統架構):
- 5、DDD和微服務
- 2、領域、子域、核心域、通用域、支撐域
- 3、限界背景關系
- 4、物體和值物件:從領域模型的基礎單元看系統設計
- 物體物件(業務層面)
- 值物件(資料層面)
- 物體物件VS值物件
- 5、怎樣設計聚合?聚合和聚合根
- 聚合根解決了什么問題?
- 聚合根承擔的角色是什么?
- 如何判斷一個物體是否是聚合根?
- 6、領域事件
- 7、中臺
DDD(Domain Driving Design)領域驅動開發
1、微服務設計為什么選擇DDD
1、架構對比
-
單機架構:資料驅動架構
-
集中式架構:面向物件的方式(三層架構)
-
分布式微服務架構:應用之間解藕,解決單體用擴展性和彈性伸縮能力不足問題
2、微服務的問題
-
微服務粒度
-
怎樣拆分
-
邊界是什么
DDD 核心思想是通過領域驅動設計方法定義領域模型,從而確定業務和應用邊界,保證業務模型與代碼模型的一致性,
3、戰略設計(業務層面-業務架構)
建立領域模型、劃分領域邊界,從業務的視角來劃分微服務邊界(收斂的程序)
- 物體
- 命令
- 事件
領域模型:指導微服務的設計和拆分,事件風暴是建立領域模型的主要的方法,
事件風暴:
- 從發散到收斂的一整個程序
- 采用方法:用例分析、場景分析、用戶旅程分析
- 產出:產出物體、命令、事件等領域物件,將領域物件從不同維度進行聚類形成聚合、限界背景關系等邊界,建立領域模型
邏輯邊界、物理邊界
4、戰術設計(技術層面-系統架構):
側重于領域模型的實作,側重于代碼邏輯的設計和實作
實作層面
- 邏輯邊界
- 物理邊界
5、DDD和微服務
DDD:主要關注從業務領域視角劃分領域邊界,通過業務抽象建立領域模型,維持業務和代碼層面的一致性
微服務:主要是從技術層面,實作去中心化資料管理和去中心化服務治理,關注微服務的獨立開發、測驗、構建和部署
總結:DDD是一種架構設計方法,微服務是一種架構風格,DDD是一種從業務視角去分離系統建設復雜度的手段,應用于微服務中,DDD解決微服務設計程序中邊界難以界定的問題,
2、領域、子域、核心域、通用域、支撐域
-
領域:指一種特定的范圍,用于限制業務邊界和范圍的,
-
子域:對應更小的業務范圍
- 核心域:決定產品和公司核心競爭力的子域,業務成功的主要因素和公司的核心競爭力
- 通用域:需要用到的通用系統
- 支撐域:具有企業特性,但不具有通用性
復雜問題拆解細分,建立子域
- 研究物件
- 研究物件細分
領域的核心思想就是將問題域逐級細分,來降低業務理解和系統實作的復雜度,通過領域細分,逐步縮小微服務需要解決的問題域,構建合適的領域模型,而領域模型映射成系統就是微服務了,通過領域劃分,區分不同子域在公司內的不同功能屬性和重要性(核心域、通用域、支撐域),從而公司可對不同子域采取不同的資源投入和建設策略
3、限界背景關系
-
通用語言定義背景關系含義,限界背景關系則定義領域邊界
-
限界背景關系就是用來細分領域,從而定義通用語言所在的邊界
-
一個限界背景關系理論上就可以設計為一個微服務
4、物體和值物件:從領域模型的基礎單元看系統設計
DDD 引入值物件是希望實作從“資料建模為中心”向“領域建模為中心”轉變,物體和值物件是微服務底層的最基礎的物件,DDD 提倡從領域模型設計出發,而不是先設計資料模型,
物體物件(業務層面)
-
物體和值物件是組成領域模型的基礎單元,
-
在代碼模型中,物體的表現形式是物體類,這個類包含了物體的屬性和方法
值物件(資料層面)
在領域建模時,我們可以將部分物件設計為值物件,保留物件的業務涵義,同時又減少了物體的數量;在資料建模時,我們可以將值物件嵌入物體,減少物體表的數量,簡化資料庫設計,
物體物件VS值物件
- 物體一般對應業務物件,它具有業務屬性和業務行為;而值物件主要是屬性集合,對物體的狀態和特征進行描述,
總結:值物件的引入,保留了業務層面的含義,減少了物體數量,并且在資料建模層面,簡化了資料庫設計
5、怎樣設計聚合?聚合和聚合根
-
聚合就是由業務和邏輯緊密關聯的物體和值物件組合而成的,聚合是資料修改和持久化的基本單元,每一個聚合對應一個倉儲,實作資料的持久化,
-
聚合在 DDD 分層架構里屬于領域層,領域層包含了多個聚合,共同實作核心業務邏輯
聚合根解決了什么問題?
聚合根的主要目的是為了避免由于復雜資料模型缺少統一的業務規則控制,而導致聚合、物體之間資料不一致性的問題
聚合根承擔的角色是什么?
如果把聚合比作組織,那聚合根就是這個組織的負責人,聚合根也稱為根物體,它不僅是物體,還是聚合的管理者,
如何判斷一個物體是否是聚合根?
可以結合以下場景分析:是否有獨立的生命周期?是否有全域唯一 ID?是否可以創建或修改其它物件?是否有專門的模塊來管這個物體?
6、領域事件
用來表示領域中發生的事件,一個領域事件將導致進一步的業務操作,在實作業務解耦的同時,還有助于形成完整的業務倍訓,領域事件來驅動業務的流轉
7、中臺
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300546.html
標籤:其他
