系統設計思想之Domain驅動

纪煜楷發表於2024-09-05

一、DDD從放棄到入門

希望瞭解一套微服務框架的;希望學習到新技術的;開發的系統不復雜,模組少而獨立的;當前自己設計的架構已滿足擴充性,可複用性,技術與業務複雜度已分離的;
這幾類人群不是DDD的目標人群,建議儘早放棄,學習領域驅動設計能得到的收穫概括起來大致如下:
1、領域驅動設計是一套系統的設計思想,規範你的設計過程
2、領域驅動設計用於處理模組繁雜,業務複雜度高的產品研發,旨在將將業務複雜度與技術複雜度分 離,抽離出業務各個領域的核心核心,便於領域知識的複用
3、領域驅動設計強調技術專家和業務專家,透過統一的語言來完成領域的建模,幫助技術側和業務側形 成一套統一的語言
4、微服務與領域驅動設計天然搭配,微服務拆分中一直模糊的邊界,可透過領域驅動設計來劃分清楚
5、領域驅動設計能幫助提高大型系統的擴充和演進能力
二、什麼是DDD
如下圖,傳統的敏捷開發模式,我們更多的使用資料驅動設計的思想,按照功能模組來,拆分成一個個的小模組,每個模組要實現什麼功能,需要什麼樣的資料,然後就透過ER資料建模,建庫建表後開幹了,這樣會導致N個系統中重複的功能會反覆建設,Service層編寫了繁雜的業務邏輯,耦合度極高,經常牽一髮而動全身。
 

  而DDD是指需求輸入的時候,從領域開始聊起,比如教育是一個領域,先從校長聊起,然後聊到他的關聯實體老師,學生,考試等等,這些實體之間的關聯關係是什麼,他們各自都會有哪些行為方法和業務邏輯。聊清楚後進行實體的建模,聚合實體的行為形成一個個領域服務,比如學生+老師的實體組合成了上課這一領域服務,之後再對領域服務進行編排,組成核心的可複用的業務邏輯。
 再之後就是經過領域模型劃分微服務界限,對映模型和微服務程式碼後進行開發,DDD就是以領域為入口,來解決產品設計,研發的思想。
  
  DDD透過領域建模,編排核心業務邏輯後對映到微服務開發的過程,有利於構建出企業可複用的核心能力,減少重複的IT建設,同時開發者可以根據模型和微服務程式碼設計的對應關係,快速清晰的完成開發。同時後面博文會講到DDD嚴格的分層結構設計,能夠幫助構建一個“低耦合,高內聚”,可演進的系統。
三、DDD的戰略和戰術
  DDD不是架構,而是架構設計思想,演進的方法論,旨在聚焦業務領域模型來控制業務的複雜性,同時分離技術和業務耦合的複雜性。
  DDD包括戰略設計和戰術設計兩部分
  戰略設計:從業務視角出發,業務領域專家和技術專家透過事件風暴,建立共同的語言,構建領域模型,同時劃分好領域的限界上下文,並以限界上下文作為微服務拆分和設計的邊界,做業務核心邏輯的編排,從而在業務中臺構建可複用的核心能力。
  戰術設計:從技術角度出發,聚焦於領域模型如何對映到微服務程式碼開發的實現上。限界上下文和領域模型作為輸入,從領域模型中抽象出來聚合,聚合根,實體,值物件,領域服務,領域事件,應用服務編排,倉儲等,以表格或其他形式一一對照模型去設計程式碼,並最終結合分散式快取,訊息最終一致性等基礎支撐實現落地。
  DDD按照一定規則將業務領域細分,細分到一定程度後,DDD將要解決的問題限定在特定範圍內,這個過程中,可以將領域劃分為子域,子域還可以繼續劃分為子子域,直到細分的程度,可以明確的區分不同業務領域,又不至於過度拆分,並適合微服務團隊實施落地。DDD通常將劃分後的子域區分為核心子域,支撐子域和通用子域。比如電商領域的子域劃分
   

  DDD這種子域的劃分方法,可以幫助企業IT建設過程中確定中臺的領域邊界。

四、DDD,中臺和微服務如何協同工作
  業務中臺的形成,實際也是業務領域不斷細分,演進和能力沉澱的過程,所以中臺是DDD戰略設計的落地,DDD最擅長的就是領域建模。
  微服務的架構設計,參照著建模後的領域模型和限界上下文,作為微服務拆分的邊界和依據,然後微服務與領域裡的一個個子域互相對映,完成程式碼開發,是DDD的戰術落地。
  

  本文先從粗粒度來描述DDD戰略設計和戰術設計的實現,細粒度的實現待後面更新完子域,限界上下文,實體和值物件,聚合和聚合根,倉儲模式,領域事件,分層架構等等後自然瞭解。下面看領域建模和中臺建設,如何對映與關聯。

  

  通用中臺對應的DDD的通用子域和支撐子域,實現企業可複用的通用業務能力,核心中臺對應DDD的核心子域,這部分是DDD戰略設計落地的產物。
領域模型和限界上下文,則與中臺建設中的微服務對應,DDD建立的領域模型可以作為微服務劃分的依據,完成微服務的拆分和開發,這部分是DDD戰術設計落地的產物。
中臺業務抽象就是領域建模的過程,系統抽象就是微服務設計過程,中臺業務建模和落地,大致分如下幾步
1、選取主領域模型,按照業務流程節點,將業務劃分為業務中臺(多個核心子域),將通用的功能和支撐劃分為通用中臺(通用域,支撐域),較大範圍的業務領域,需要再逐級劃分為大小合適的領域再構建領域模型
2、選取邏輯相對完整的領域模型作為主領域模型(如使用者這個領域物件,常常分散到不同的領域模型中)以主領域為基準,掃描其他中臺領域模型,檢查是否存在功能重疊的模型,合併到主領域模型,完成領域模型的提煉
3、選擇其他主領域模型重複第二步,直到完成所有領域模型的比對
4、將領域模型作為微服務設計的輸入,完成微服務拆分和設計

  

  參考書籍 ——《基於DDD和微服務的中臺架構與實現》歐創新、鄧頔
  參考書籍 ——《領域驅動設計》Eric Evans
  參考書籍 ——《架構真經》Martin L. Abbott

相關文章