1. 程式人生 > 其它 >DDD領域驅動設計落地實踐(十分鐘看完,半小時落地)

DDD領域驅動設計落地實踐(十分鐘看完,半小時落地)

一、引子

不知今年吹了什麼風,忽然DDD領域驅動設計進入大家視野。該思想源於2003年 Eric Evans編寫的“Domain-Driven Design領域驅動設計”簡稱DDD,Evans DDD是一套綜合軟體系統分析和設計的面向物件建模方法。剛好公司領導強力推薦這個,抱著學習的心態,耗時5個月,體驗了一把:“DDD從入門到棄坑”。

二、思想

學習網站:https://www.jdon.com/ddd.html

伺服器後端發展三個階段:

  1. 面向過程指令碼:初始簡單,業務複雜後,維護難度指數上升。-->基本不為主流使用
  2. 面向資料庫表:初始難度中,業務複雜後,維護難度延遲後再指數上升。--->目前市面上主流
  3. 面向業務模型:DDD+SOA微服務的事件驅動的CQRS讀寫分離架構:應付複雜業務邏輯,以聚合模型替代資料表模型,以併發的事件驅動替代串聯的訊息驅動。真正實現以業務實體為核心的靈活拓展。初始難度高,業務複雜後,維護難度線性上升(已很不錯)

  DDD革命性在於:領域模型準確反映了業務語言,而傳統微服務資料物件除了簡單setter/getter方法外,沒有任何業務方法,即失血模型,那麼DDD領域模型就是充血模型

三、落地

3.1 領域模型設計

以渠道中心(一個微服務)作為例子來做領域模型設計,核心就是設計2個圖,一個是戰略設計圖(巨集觀) ,一個是戰術設計圖(細節)。

1.領域戰略設計圖

戰略設計圖是從一個限界上下文的角度出發去分析業務場景。主要是巨集觀上的核心域、子域、實體關係圖。demo如下圖:

2.領域戰術設計圖

戰術設計圖是從一個限界上下文的角度出發去分析業務場景。細化到核心業務欄位、領域實體、值物件、領域服務、領域事件等等。基本上這個圖畫完,程式碼已經知道怎麼寫了。demo如下圖:

3.2 技術實現

整體專案框架分層圖如下所示:

如上圖,4層典型DDD分層結構,

1.展現層:controller層。無業務邏輯

2.應用服務層:此層可以包含查詢邏輯,但核心業務邏輯必須下沉到領域層。

3.領域服務層:業務在這裡組裝。倉儲(資源庫)介面在此層定義。

4.基礎設施層:倉儲(資源庫)實現層+PO持久化層。

注:

1.簡單查詢不涉及業務,是可以直接從應用層直接穿透到PO查詢,不需要經過domain層。如下圖所示,DDD本身是不限制非業務類操作跨層呼叫的。

2.DTO是不能存在於domain層的,DDD設計不認為DTO是業務物件,entity才是。或者傳值簡單資料型別也是可以的。

3.2.1 服務呼叫問題

1.域內呼叫

領域內呼叫,隨便呼叫,絲般順滑。至於實現,可以由一個核心域的倉儲實現層(第四層)去實現多個Repository介面。(比如這裡A是核心域的實體名,B是支撐域、通用域等)

2.跨域呼叫

跨域分為

  • 1.同上下文跨域:ACL層->Adapter介面卡層→呼叫其它域的repository。--->不得已才使用,不推薦使用。
  • 推薦:1.使用領域事件 eventbus來做解耦(nest-eventbus使用

    2.考慮是否有可能合併為一個領域.

  • 2.跨上下文(肯定跨域):ACL層->Adapter介面卡層->feign呼叫

3.2.2 包結構

包結構如下:

展開包結構如下:

展現層:Controller,僅做介面的入口定義和編排轉發,不做任何的業務處理;

應用服務層:application,負責介面引數DTO的簡單校驗,以及DTO和實體值物件的資料轉換,對於簡單的業務,也可以在應用層載入實體直接執行實體行為方法;

領域層:

  • 模型:根據領域模型分析領域內各實體、聚合、聚合根、值物件等,這些物件在*.domain.model定義,實體內的行為方法只負責維護實體自身的生命週期和狀態;
  • 行為:領域內各實體、聚合、聚合根等,會有相應的行為,在*.domain.model包下定義行為方法;
  • 領域服務:領域提供的介面服務,需要定義在*.domain.service包下,業務相關的前置業務判斷、多個實體或值物件的行為邏輯處理等,都在領域服務中實現,需要注意的是並不是每個實體都有一個對應的領域服務,但是依賴多個實體的行為方法,最好根據這個業務模組是建立一個領域服務;
  • 倉儲:領域服務或上層應用服務需要使用到的基礎設施層,包括DB、Feign呼叫等,定義在*.domain.repository下,在*.infrastructure.repository下實現;

適配層:在acl包下的feign定義依賴外部的介面,並在acl的adapter包編寫轉換,由倉儲層操作實體時呼叫;

持久層:與常用DAO定義一致,由倉儲層操作實體時呼叫。

2)技術架構

目前業內沒有標杆,這個就不多介紹,因為我現在使用的架構也不夠完善,就不獻醜了。

四、總結

DDD可以嘗試,但不建議主流業務硬上。建議淺嘗即止。(據我所知,業內連阿里巴巴都不敢上。)

------------------個人能力有限,大家多交流,一起壯哉我大JAVA!------------------

如果你覺得本文對你有點幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!