一. 什么是領域驅動模型(DDD)?
領域驅動模型一種設計思想,我們又稱為DDD設計思想。是一種為了解決傳統設計思想帶來的維護困難,溝通困難和交互困難而產生的一種新的思想。也解決了在部分公司中,一個項目組就是一套服務,不同項目組中又相互通過RPC訪問,相互之間交互的安全保障。
二. 領域驅動模型解決了什么問題
在傳統微服務的單服務設計上,我們通常只顧自己開發,只顧自己業務,只管理自己數據庫,一旦其他服務需要使用另一個服務上的某些功能時,我們通常需要使用HTTP來內網訪問達到目的,或是使用RPC來訪問業務。首先假設我們需要用HTTP來訪問其他服務接口,首先,我們需要知道對應服務的URL,其次需要開發方提供對應的參數VO,一旦VO變化,開發方忘記通知下游業務方,下游業務方是無法感知的。接下來會講解模型中每一層概念,會一步步證明領域驅動模型的出現,降低了微服務下,服務之間的耦合程度,提高了內聚力。
三. 設計領域驅動模型
傳統設計模型:

領域驅動模型:

以下介紹的層級,即是領域驅動模型中代表的各個領域,去負責自己的范圍:
API層:
作用:存放要對外暴露的RPC接口的service層。
意義:其他服務不需要了解自身服務的業務實現,這一層很薄,只需要提供出去,其他服務知道它是干嘛的,就足夠了,即讓其他服務調用了自身業務,又沒有暴露自身的業務實現,降低安全風險。
Web層:
作用:可以對等于傳統設計的controller層,用來處理參數校驗,轉發等一些簡單的業務。
意義:與Service層剝離,其目的是為了保障biz層的獨立性,但是在maven結構中又引用biz層,可以理解為biz的下游,當需要biz處理業務的時候,通知biz幫忙處理,但是不參與biz層的業務實現,只提交對應參數。
Biz層:
作用:biz是Business的縮寫,即業務邏輯層,可以對等于傳統設計的Service層,存放的業務邏輯,biz中也存在service,biz中的service存放的是內部使用,不對外提供的service。api層和biz層的service業務邏輯實現都存放在biz層中。
意義:剝離業務邏輯,防止業務邏輯暴露,同時與dal層剝離,保證自身獨立性,不與dal層耦合。這一層也是服務核心層,是處理下游提交的需求與數據之間交互的重要層級。
dal層:
作用:dal是Data Access Layer的英文縮寫,即數據訪問層,可以對等于傳統設計的Dao層,主要是用來負責與數據的交互,比如Mysql、ES、HBase等。通常我們的Mybatis的Mapper和JPA就在這一層編寫。
意義:讓業務與數據隔離,dal層成為了biz層的上游,負責為biz的業務實現提供對應數據。同時dal與數據中間件直接映射,形成綁定關系,其他服務需要接手數據層,可以直接引用,達到高內聚的目的,又降低了代碼的耦合性,提高了開發效率。
domain層:
作用:存放一些通用的,可以對外暴露的Object、Enum等。
意義:通常用來制定一些標準,比如共同使用的枚舉、常量的定義,一般作為上游服務,提供給下游服務,需要按照標準實施的內容。
config層:
作用:存放一些通用的配置,如緩存、中間件、日志和消息消費等通用配置,注意一點的是,消息消費簡單的處理是放在該層,涉及到本服務數據交互的業務,還是需要寫在biz層,在biz中去實現較為復雜的業務,消息消費放在該層中也是為了便于維護。
意義:配置獨立化,便于管理與維護。
client層:
作用:存放調用第三放平臺,外部服務等RPC或HTTP接口服務等。如通過pom引入其他服務的api層,編寫調用http接口的實現,但與本服務數據交互的業務仍在biz層中實現。
意義:第三方內容獨立化,便于管理與維護。