DDD 分層架構、整潔架構和六邊形架構
DDD 可以使用分層架構、整潔架構、六邊形架構、SOA 架構、REST 風格、CRQS 架構、事件驅動架構、數據網織和基於網格的分佈式計算等多種架構方式和風格。今天西二旗程序員跟大家聊聊分層架構、整潔架構和六邊形架構,幫助大家進一步瞭解 DDD。
1. DDD 分層架構
DDD 分層架構中有很重要的依賴原則:每層只能與位於下方的層發生耦合,類似於網絡的 7 層或 TCP/IP 的 4 層模型架構,每一層各司其職,並且只關心向下一層的實現,而不會出現各層耦合。DDD 分層架構中包含四層:從上到下分別是用戶接口層,應用層,領域層和基礎層。
DDD 四層架構也基於傳統三層架構的。
不同點有以下幾方面:
-
關注點不一樣:三層架構關注請求調用順序;DDD 架構關注領域服務。
-
橫向劃分方式不一樣:三層架構主要關注縱向劃分,對橫向劃分沒有約定;DDD 架構更關注縱向,即:多個領域層之間劃分及交互方式。
-
對資源的定位不一樣:三層架構把所有依賴的數據都放到數據訪問層;DDD 架構只將領域強關聯的數據放到 Repository 中,其他比如 API 層緩存、文件等都當成基礎服務來處理。
2. 整潔架構(又名洋蔥架構)
2008 年 Jeffrey Palermo 已經提出了具有分層思想的洋蔥架構,如下圖,同心圓代表軟件的不同部分,從裏向外依次是領域模型,領域服務,應用服務和外層的基礎設施和用戶終端。
洋蔥架構根據依賴原則,定義了各層的依賴關係,越往裏依賴程度越低,代碼級別越高,越是核心能力。外圓代碼依賴只能指向內圓,內圓不需要知道外圓的情況,這種架構也是典型的分層架構,和 DDD 分層架構一樣,都體現了高內聚,低耦合的設計特性。洋蔥架構也常作爲指導微服務設計的重要架構之一。
3. 六邊形架構
2005 年 Alistair Cockburn 提出了六邊形架構,在這個架構中,將應用分爲內六邊形和外六邊形兩層,內六邊形實現應用的核心業務邏輯。外六邊形完成外部應用,基礎資源等的交互和訪問,對於與不同的外部系統交互,由外六邊形的適配器負責協議轉換,保證內六邊形業務邏輯的乾淨。
這種架構也是典型的分層架構,和 DDD 分層架構一樣,都體現了高內聚,低耦合的設計特性。六邊形也常作爲指導微服務設計的重要架構之一。
4. DDD 分層協作
DDD 各層的主要職責和怎麼分工協作如下圖:
-
PO(數據持久化對象):與數據庫字段映射的數據載體
-
DO(領域對象):領域模型核心業務對象的載體,包括實體和值對象
-
DTO(數據傳輸對象):用於前端和微服務交互的數據傳輸載體
-
用戶接口層:
接口層主要有 facade 接口,Assembler 轉換器,微服務面向不同前端時,需要展示的數據可能不同,此時由於需要保持領域核心業務邏輯的穩定,不可能去定製開發各種領域服務和應用服務編排。因此爲避免暴露服務端業務邏輯,防止非必需的字段數據外泄,同時保證領域邏輯簡潔,用戶接口層的 Facade 接口和 Assembler 轉換器就發揮作用了。
Facade 接口用於封裝應用服務,適配不同前端需要的字段,提供不同要求的服務接口適配。Assembler 根據不同前端的數據請求,完成 DTO 和領域 DO 對象的組裝,轉換,完成數據適配。
-
應用層:
應用層連接用戶接口層和領域層,主要協調領域層,面向用例和業務流程,協調多個聚合完成服務的組合和編排,在這一層不實現任何業務邏輯,只是很薄的一層。
應用層編排成應用服務後,會被接口層 Facade 封裝,完成接口和數據適配後,以粗粒度向 API 網關發佈服務。應用層還負責事件的訂閱和發佈,以及與其他外部服務的交互,事件的具體實現則在領域層
**如何判定一個東西是否屬於業務邏輯?**很簡單,只需設想你和產品聊這個事情時,需不需要把這部分信息輸入給它?比如接口調用的處理,數據的轉換,是否加了緩存等等都不屬於產品關心的東西,所以不算是業務邏輯。
-
領域層:
領域層位於應用層之下,是領域模型的核心,主要實現領域模型的核心業務邏輯,體現領域模型的業務能力。
領域層關注實現領域對象的充血模型和聚合本身的原子業務邏輯,至於用戶操作和業務流程,則交給應用層去編排。這樣設計可以保證領域模型不容易受外部需求變化的影響,保證領域模型的穩定。
跨多個聚合的領域邏輯在領域層實現,由領域服務組織和協調多聚合的多實體,實現原子業務邏輯。
-
基礎層:
基礎層貫穿了 DDD 所有層,包括第三方工具,API 網關,消息中間件,分佈式事務,消息最終一致性能力,數據庫,緩存能能力的提供。
基礎層有倉儲模式的代碼邏輯,通過倉儲接口和倉儲實現,解耦領域層和基礎層,保證領域核心業務邏輯的乾淨,降低 DB 資源變化給領域層帶來的影響。
今天就給大家分享這些,感謝關注和支持。掃碼關注【西二旗程序員】,不迷路。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/YoGMbICYUWz49u0aPuSqDg