【DDD】基於DDD的分層設計


參考:https://insights.thoughtworks.cn/ddd-in-distributed-system/  在分布式系統中使用DDD


 

DDD 的四層架構: 接入層、應用層(Application Servier)、領域層(Domain Service)、基礎設施層

- 接入層:在復雜度不高的情況下,我們往往把接入層和應用層合並部署,

  • 關心視圖和對外的服務,Restful、頁面渲染、websocket、XMPP 連接等
  • 如果沒有多種接入方式,可以和應用層合並
  • 對應到分布式系統中的網關、BFF、前台等概念
  • 只產生接入異常,例如數據校驗,對應 HTTP 狀態碼 400、415 等
  • 一個應用可以有多個接入層
  • 接入層做和業務規則無關的 bean validation 驗證
  • 准單體系統下,按照連接方式分包

- 應用層:  

  • 關心處理完一個完整的業務
  • 該層只負責業務編排,對象轉換,實際業務邏輯由領域層完成
  • 不關心請求從何處來,但是關心誰來、做什么、有沒有權限做
  • 集成不同的領域服務解決問題
  • 最終一致性(最終一致性對業務有侵入)事務放到這層
  • 對應到分布式系統中的中台等概念
  • 方法級別的功能權限控制放到這層
  • 只產應用異常,對應 HTTP 狀態碼 403、401
  • 准單體系統下,按照應用划分模塊

- 領域層:  

  • 不關心場景,關心模型完整性和業務規則
  • 不關心誰來,不關心場景完整的業務,關心當前上下文的業務完整
  • 強一致性事務放到這層,聚合的事務是 "理所當然的"
  • 對應到分布式系統中的 domain service、后台等概念
  • 領域層做業務規則驗證
  • 產生業務規則異常,例如用戶退款條件不滿足,對應狀態碼 412、419 等
  • 數據權限放到這層(比如只允許刪除自己創建的商品),因為數據權限涉及業務規則
  • 准單體系統下按照上下文分包,上下文之間調用必須走領域 domain service,目的就是解耦
  • 上下文中分聚合,聚合根要足夠小,只允許聚合根擁有對應的 domain service
  • 根據業務情況,參考反范式理論,跨上下文使用值對象做必要的數據冗余

- 基礎設施層:技術設施層並不是指 MySQL、Redis 等外部組件,而是外部組件的適配器,Hibernate、Mybatis、Redis Template 等,因此在 DDD 中適配器模式被多次提到,基礎設施層往往不能單獨存在,還是要依附於領域層。技術設施層的適配器還包括了外部系統的適配  

  • 關心存儲、通知、第三方系統等外部設施(防腐層隔離)
  • 如果使用自動化的 ORM,這層可以在一定程度上省略
  • 基礎設施異常,應丟出內部異常,對應狀態碼 500
  • 准單體系統下按照 adapter 分包
  • 基礎設施的權限由配置到應用的憑證控制,例如數據庫、對象存儲的憑證,技術設施層不涉及用戶的權限

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM