DDD實戰筆記(1) 什麼是DDD領域驅動

1. 概述

DDD 是一種處理高度複雜領域的設計思想,它試圖分離技術實現的複雜性,並圍繞業務概念構建領域模型來控制業務的複雜性,以解決軟件難以理解,難以演進的問題。DDD 不是架構,而是一種架構設計方法論,它通過邊界劃分將複雜業務領域簡單化,幫我們設計出清晰的領域和應用邊界,可以很容易地實現架構演進。

2.什麼是領域?

DDD通過分析業務,最終構建成一個個“領域”,設計出一個個富含業務行爲的、飽滿的“領域模型”。

在DDD裏,“領域”指的就是一塊業務範圍。比如在一個電商系統中,可能會有“商品領域”、“訂單領域”、“物流領域”、“倉儲領域”等等。DDD通過戰略部分指導我們根據業務劃分出業務領域,並區別出哪些是核心領域,哪些是支撐領域和通用領域。這個我們會在本系列後面的文章中詳細解釋。

“領域模型”指的是業務的載體對象,比如“商品”、“訂單”等等。這些對象具有一些有業務含義的方法,比如“商品.加入購物車”方法。我們把主要的業務邏輯內聚在領域對象裏,這樣一個操作要做的事情就變得非常清晰,並且易於維護。

簡單來說,“領域”和“領域模型”能夠更直觀地表現業務,把業務真正落地到系統架構和代碼設計上。

3.什麼時候適合DDD設計?

一般來說,DDD適用於“業務複雜”的且“需要維護和擴展”的系統。

首先,我們來看看什麼叫業務複雜。試想一下,如果你的系統只需要對幾個簡單的表進行CRUD,那你不需要使用DDD,甚至都不需要開發一個應用程序,直接使用一個數據庫客戶端可能就能解決問題。

從經驗上來看,如果你的系統有30個以內的業務操作或用戶故事,那也是沒有太大必要去使用DDD的。而如果超過三四十個,軟件就會有一定的複雜性,這個時候就可以考慮使用DDD了。

4.DDD能提供什麼?

進入微服務架構時代以後,微服務確實也解決了原來採用集中式架構的單體應用的很多問題,比如擴展性、彈性伸縮能力、小規模團隊的敏捷開發等等。

但在看到這些好處的同時,微服務實踐過程中也產生了不少的爭論和疑惑:微服務的粒度應該多大呀?微服務到底應該如何拆分和設計呢?微服務的邊界應該在哪裏?

可以說,很久以來都沒有一套系統的理論和方法可以指導微服務的拆分,包括微服務架構模式的提出者 Martin Fowler 在提出微服務架構的時候,也沒有告訴我們究竟應該如何拆分微服務。

用 DDD 設計方法來建立領域模型,劃分領域邊界,再根據這些領域邊界從業務視角來劃分微服務邊界。而按照 DDD 方法設計出的微服務的業務和應用邊界都非常合理,可以很好地實現微服務內部和外部的“高內聚、低耦合”。
DDD 是一種處理高度複雜領域的設計思想

5.DDD 設計理念

DDD 包括戰略設計和戰術設計兩部分。

戰略設計主要從業務視角出發,建立業務領域模型,劃分領域邊界,建立通用語言的限界上下文,限界上下文可以作爲微服務設計的參考邊界。

戰術設計則從技術視角出發,側重於領域模型的技術實現,完成軟件開發和落地,包括:聚合根、實體、值對象、領域服務、應用服務和資源庫等代碼邏輯的設計和實現。
在這裏插入圖片描述

我們可以用三步來劃定領域模型和微服務的邊界。

第一步:在事件風暴中梳理業務過程中的用戶操作、事件以及外部依賴關係等,根據這些要素梳理出領域實體等領域對象。

第二步:根據領域實體之間的業務關聯性,將業務緊密相關的實體進行組合形成聚合,同時確定聚合中的聚合根、值對象和實體。在這個圖裏,聚合之間的邊界是第一層邊界,它們在同一個微服務實例中運行,這個邊界是邏輯邊界,所以用虛線表示。

第三步:根據業務及語義邊界等因素,將一個或者多個聚合劃定在一個限界上下文內,形成領域模型。在這個圖裏,限界上下文之間的邊界是第二層邊界,這一層邊界可能就是未來微服務的邊界,不同限界上下文內的領域邏輯被隔離在不同的微服務實例中運行,物理上相互隔離,所以是物理邊界,邊界之間用實線來表示。

6.DDD 與微服務的關係?

DDD 是一種架構設計方法,微服務是一種架構風格,兩者從本質上都是爲了追求高響應力,而從業務視角去分離應用系統建設複雜度的手段。兩者都強調從業務出發,其核心要義是強調根據業務發展,合理劃分領域邊界,持續調整現有架構,優化現有代碼,以保持架構和代碼的生命力,也就是我們常說的演進式架構。

DDD 主要關注:從業務領域視角劃分領域邊界,構建通用語言進行高效溝通,通過業務抽象,建立領域模型,維持業務和代碼的邏輯一致性。

微服務主要關注:運行時的進程間通信、容錯和故障隔離,實現去中心化數據管理和去中心化服務治理,關注微服務的獨立開發、測試、構建和部署。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章