DDD 架構(gòu)
1.Domain Primitive
接口的清晰度(可閱讀性):混亂
數(shù)據(jù)驗(yàn)證和錯(cuò)誤處理:大量重復(fù)
業(yè)務(wù)邏輯代碼的清晰度:膠水代碼,邏輯混亂赘淮,校驗(yàn)業(yè)務(wù)耦合
可測(cè)試性:無(wú)法單獨(dú)測(cè)試
隱性的概念顯性化:如將用戶辕录,地址,金錢信息顯性化梢卸,獨(dú)立行為走诞,獨(dú)立維護(hù),拆分?jǐn)?shù)據(jù)校驗(yàn)等
--值對(duì)象抽離蛤高,實(shí)體Entity+值對(duì)象Entity聚合蚣旱,---不變性碑幅,無(wú)狀態(tài)(共享值對(duì)象),專享實(shí)體
2.應(yīng)用架構(gòu)
獨(dú)立與框架
獨(dú)立于UI
獨(dú)立于底層數(shù)據(jù)源
獨(dú)立于外部依賴
可測(cè)試
可維護(hù)性塞绿,可拓展性沟涨,可測(cè)性--問(wèn)題
基礎(chǔ)設(shè)施層Repository和Entity:dao
第三方服務(wù)-防腐層:適配器,緩存异吻,兜底裹赴,降級(jí),易于測(cè)試
封裝業(yè)務(wù)邏輯:貧血模型诀浪,充血模型
貧血模型:壞處:調(diào)用方邏輯棋返,重復(fù)率極高,健壯性差雷猪;為什么出現(xiàn):面向數(shù)據(jù)庫(kù)編程CRUD懊昨,簡(jiǎn)單,流水代碼春宣,好寫但不好維護(hù)酵颁;
舉例:MVC如果做緩存,怎么做月帝??jī)?yōu)化層級(jí)躏惋,以及模型DO Entity DTO
3.領(lǐng)域?qū)釉O(shè)計(jì)規(guī)范
行為抽離,組件化嚷辅,數(shù)據(jù)驅(qū)動(dòng)
事件模型:生成簿姨,存儲(chǔ),分發(fā)簸搞,消費(fèi)
領(lǐng)域事件:通過(guò)行為抽離扁位,
4.接口層
調(diào)用來(lái)源,統(tǒng)一鑒權(quán)趁俊,限流域仇,統(tǒng)一異常
CQE對(duì)象
不要有業(yè)務(wù)邏輯,做業(yè)務(wù)流程串聯(lián)就好
可維護(hù)性高 當(dāng)外部依賴變更時(shí)寺擂,內(nèi)部代碼只用變更跟外部對(duì)接的模塊暇务,其他業(yè)務(wù)邏輯不變(數(shù)據(jù)
遷移時(shí)主鍵的處理與屏蔽、緩存處理)怔软。 邊界清晰垦细,各個(gè)層之間只依賴領(lǐng)域?qū)拥慕涌冢灰蕾嚲唧w實(shí)現(xiàn)挡逼。 基礎(chǔ)設(shè)施層與應(yīng)用解耦括改,方便基礎(chǔ)設(shè)施層依賴庫(kù)的升級(jí)。
可擴(kuò)展性強(qiáng)
做新功能時(shí)家坎,絕大部分的代碼都能復(fù)用嘱能,僅需要增加核心業(yè)務(wù)邏輯即可吝梅。 數(shù)據(jù)來(lái)源多樣性,基礎(chǔ)設(shè)施層負(fù)責(zé)從各個(gè)渠道獲取數(shù)據(jù)(數(shù)據(jù)庫(kù)焰檩、緩存憔涉、消息隊(duì)列)
兼容不同的數(shù)據(jù)格式订框。 同時(shí)基礎(chǔ)設(shè)施的層出現(xiàn)可以將更新收口析苫,方便后期升級(jí)更換數(shù)據(jù)源(加入數(shù)據(jù)緩存服
務(wù)等)。 可測(cè)試性高
每個(gè)拆分出來(lái)的模塊都符合單一性原則穿扳,絕大部分不依賴框架衩侥,可以快速的單元測(cè)試
做到 100%覆蓋。 當(dāng)代碼中強(qiáng)依賴了數(shù)據(jù)庫(kù)矛物、第三方服務(wù)茫死、中間件等外部依賴之后,想要完整跑通一個(gè)
測(cè)試用例需要確保所有依賴都能跑起來(lái)履羞,這個(gè)在項(xiàng)目早期是及其困難的峦萎。良好的分層可以 mock 數(shù)據(jù)快速單獨(dú)測(cè)試肖粮。
代碼結(jié)構(gòu)清晰
通過(guò) POM module 可以解決模塊間的依賴關(guān)系徽千,
基礎(chǔ)平臺(tái)目前 DDD 應(yīng)用現(xiàn)狀:
- 支持獨(dú)立部署與混合部署,
- 各個(gè)域之間 通過(guò)接口依賴真竖,單獨(dú)學(xué)習(xí)某一個(gè)的成本低
- 可拓展性好糙及,預(yù)留拓展接口(緩存详幽、ES)
- 可測(cè)試性高,各層解耦浸锨,可單獨(dú)測(cè)試