前言
為什么需要DDD
微服務(wù)拆分困境產(chǎn)生的根本原因就是不知道業(yè)務(wù)或者微服務(wù)的邊界到底在什么地方。換句話說(shuō),確定了業(yè)務(wù)邊界和應(yīng)用邊界,這個(gè)困境也就迎刃而解了。
如何確定,是否有相關(guān)理論或知識(shí)體系支持呢?
2004 年埃里克·埃文斯(Eric Evans)發(fā)表了《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》(Domain-Driven Design –Tackling Complexity in the Heart of Software)這本書(shū),從此領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain Driven Design,簡(jiǎn)稱(chēng) DDD)誕生。DDD 核心思想是通過(guò)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法定義領(lǐng)域模型,從而確定業(yè)務(wù)和應(yīng)用邊界,保證業(yè)務(wù)模型與代碼模型的一致性。


一、DDD基礎(chǔ):
1.DDD 的核心知識(shí)體系:

2.DDD的設(shè)計(jì)思路:
1.戰(zhàn)略設(shè)計(jì)主要從業(yè)務(wù)視角出發(fā),建立業(yè)務(wù)領(lǐng)域模型,劃分領(lǐng)域邊界,建立通用語(yǔ)言的限界上下文,限界上下文可以作為微服務(wù)設(shè)計(jì)的參考邊界。
2.戰(zhàn)術(shù)設(shè)計(jì)則從技術(shù)視角出發(fā),側(cè)重于領(lǐng)域模型的技術(shù)實(shí)現(xiàn),完成軟件開(kāi)發(fā)和落地,包括:聚合根、實(shí)體、值對(duì)象、領(lǐng)域服務(wù)、應(yīng)用服務(wù)和資源庫(kù)等代碼邏輯的設(shè)計(jì)和實(shí)現(xiàn)
3. 戰(zhàn)略和戰(zhàn)術(shù)設(shè)計(jì)常用方法
- 四色建模法


- 用例分析法

- 事件風(fēng)暴法

- 限界筆紙法


4.用三步來(lái)劃定領(lǐng)域模型和微服務(wù)的邊界:
一步: 在事件風(fēng)暴中梳理業(yè)務(wù)過(guò)程中的用戶操作、事件以及外部依賴(lài)關(guān)系等,根據(jù)這些要素梳理出領(lǐng)域?qū)嶓w等領(lǐng)域?qū)ο蟆?/p>
第二步: 務(wù)緊密相關(guān)的實(shí)體進(jìn)行組合形成聚合,同時(shí)確定聚合中的聚合根、值對(duì)象和實(shí)體。
第三步: 根據(jù)業(yè)務(wù)及語(yǔ)義邊界等因素,將一個(gè)或者多個(gè)聚合劃定在一個(gè)限界上下文內(nèi),形成領(lǐng)域模型。在這個(gè)圖根據(jù)領(lǐng)域?qū)嶓w之間的業(yè)務(wù)關(guān)聯(lián)性,將業(yè)里,限界上下文之間的邊界是第二層邊界,這一層邊界可能就是未來(lái)微服務(wù)的邊界,不同限界上下文內(nèi)的領(lǐng)域邏輯被隔離在不同的微服務(wù)實(shí)例中運(yùn)行,物理上相互隔離
3.DDD 與微服務(wù)的關(guān)系:
DDD 主要關(guān)注:從業(yè)務(wù)領(lǐng)域視角劃分領(lǐng)域邊界,構(gòu)建通用語(yǔ)言進(jìn)行高效溝通,通過(guò)業(yè)務(wù)抽象,建立領(lǐng)域模型,維持業(yè)務(wù)和代碼的邏輯一致性。
微服務(wù)主要關(guān)注:運(yùn)行時(shí)的進(jìn)程間通信、容錯(cuò)和故障隔離,實(shí)現(xiàn)去中心化數(shù)據(jù)管理和去中心化服務(wù)治理,關(guān)注微服務(wù)的獨(dú)立開(kāi)發(fā)、測(cè)試、構(gòu)建和部署
4.核心域、支撐域和通用域
核心域: 決定產(chǎn)品和公司核心競(jìng)爭(zhēng)力的子域是,它是業(yè)務(wù)成功的主要因素和公司的核心競(jìng)爭(zhēng)力。
通用域: 沒(méi)有太多個(gè)性化的訴求,同時(shí)被多個(gè)子域使用的通用功能子域是。
支撐域: 還有一種功能子域是必需的,但既不包含決定產(chǎn)品和公司核心競(jìng)爭(zhēng)力的功能,也不包含通用功能的子域,它就是支撐域
5.限定上下文:
通用語(yǔ)言確定了項(xiàng)目團(tuán)隊(duì)內(nèi)部交流的統(tǒng)一語(yǔ)言,而這個(gè)語(yǔ)言所在的語(yǔ)義環(huán)境則是由限界上下文來(lái)限定的,以確保語(yǔ)義的唯一性。
而領(lǐng)域?qū)<摇⒓軜?gòu)師和開(kāi)發(fā)人員的主要工作就是 通過(guò)事件風(fēng)暴來(lái)劃分限界上下文。限界上下文確定了微服務(wù)的設(shè)計(jì)和拆分方向,是微服務(wù)設(shè)計(jì)和拆分的主要依據(jù)。如果不考慮技術(shù)異構(gòu)、團(tuán)隊(duì)溝通等其它外部因素,一個(gè)限界上下文理論上就可以設(shè)計(jì)為一個(gè)微服務(wù)。
上下文映射圖-Context Map-包含項(xiàng)目的限界上下文和他們之間的集成關(guān)系。
一份清晰的領(lǐng)域上下文映射關(guān)系圖,能夠幫助我們明確各個(gè)業(yè)務(wù)之間的關(guān)系,在進(jìn)行業(yè)務(wù)分工的時(shí)候也能夠有所依據(jù)。在ddd中各個(gè)上下文之間有多種關(guān)系,包括合作、防腐、遵奉等等,我們基于簡(jiǎn)單認(rèn)知對(duì)客戶領(lǐng)域的領(lǐng)域關(guān)系做了如下梳理(為了圖例簡(jiǎn)單,這里并不包含所有的和外部領(lǐng)域的交互,只是列出幾個(gè)作為代表):
兩種基本的集成關(guān)系:上游upstream和下游downstream。
組織模式和集成模式的定義:
- 合作關(guān)系(partnership):兩個(gè)限界上下文的團(tuán)隊(duì)要么一起成功,要么一起失敗,這兩個(gè)團(tuán)隊(duì)就是一種合作關(guān)系。
- 共享內(nèi)核(shared kernel):共享模型和代碼。
- 客戶方-供應(yīng)方開(kāi)發(fā)(customer-supplier development):上下游關(guān)系。
- 遵奉者(conformist):上下游關(guān)系,上游團(tuán)隊(duì)沒(méi)有動(dòng)力提供下游團(tuán)隊(duì)所需要的東西。
- 防腐層(anticorrupttion Layer)(ACL):某些關(guān)系無(wú)法順利實(shí)施,該層作為上游系統(tǒng)的代理向你的系統(tǒng)提供服務(wù)。
- 開(kāi)放主機(jī)服務(wù)(open host service)(OHS):定義一種協(xié)議,讓你的其他子系統(tǒng)通過(guò)該協(xié)議來(lái)訪問(wèn)你的服務(wù)。
- 發(fā)布語(yǔ)言(published language)(PL):發(fā)布一種共享語(yǔ)言完成集成交流,通常和開(kāi)放主機(jī)服務(wù)一起使用。
- 另謀他路(separate way):聲明兩個(gè)上下文不存在任何關(guān)系。
- 大泥球(big ball of mud):混雜在一起的模型。
實(shí)踐:識(shí)別自己的限界上下文,識(shí)別出那些不該屬于其中的概念,將這些概念放在另一個(gè)上下文中,再在圖中標(biāo)明兩個(gè)限界上下文之間的關(guān)系。

左上角的五個(gè)領(lǐng)域都是歸屬于客戶領(lǐng)域,互相之間都是共生共存的關(guān)系(PartnerShip,簡(jiǎn)稱(chēng)PS)。而右下角的幾個(gè)上下文都是外部領(lǐng)域,需要通過(guò)防腐層(Anticorruption Layer,ACL)來(lái)轉(zhuǎn)換交互,以隔離業(yè)務(wù)。箭頭的方向標(biāo)明了各個(gè)子域之間的上下游業(yè)務(wù)關(guān)系。
子域和限界上下文最好保持一對(duì)一的關(guān)系。
6.實(shí)體和值對(duì)象:
實(shí)體和值對(duì)象的目的都是抽象聚合若干屬性以簡(jiǎn)化設(shè)計(jì)和溝通,有了這一層抽象,我們?cè)谑褂萌藛T實(shí)體時(shí),不會(huì)產(chǎn)生歧義,在引用地址值對(duì)象時(shí),不用列舉其全部屬性,在同一個(gè)限界上下文中,大幅降低誤解、縮小偏差,兩者的區(qū)別如下:
①兩者都經(jīng)過(guò)屬性聚類(lèi)形成, 實(shí)體有唯一性,值對(duì)象沒(méi)有。在本文案例的限界上下文中,人員有唯一性,一旦某個(gè)人員被系統(tǒng)納入管理,它就被賦予了在事件、流程和操作中被唯一識(shí)別的能力,而值對(duì)象沒(méi)有也不必具備唯一性。
②實(shí)體著重唯一性和延續(xù)性,不在意屬性的變化,屬性全變了,它還是原來(lái)那個(gè)它;值對(duì)象著重描述性,對(duì)屬性的變化很敏感,屬性變了,它就不是那個(gè)它了。
③戰(zhàn)略上的思考框架穩(wěn)定不變,戰(zhàn)術(shù)上的模型設(shè)計(jì)卻靈活多變,實(shí)體和值對(duì)象也有可能隨著系統(tǒng)業(yè)務(wù)關(guān)注點(diǎn)的不同而更換位置。比如,如果換一個(gè)特殊的限界上下文,這個(gè)上下文更關(guān)注地址,而不那么關(guān)注與這個(gè)地址產(chǎn)生聯(lián)系的人員,那么就應(yīng)該把地址設(shè)計(jì)成實(shí)體,而把人員設(shè)計(jì)成值對(duì)象。
有些領(lǐng)域?qū)ο罂梢栽O(shè)計(jì)為值對(duì)象,也可以設(shè)計(jì)為實(shí)體,我們需要根據(jù)具體情況來(lái)分析。如果這個(gè)領(lǐng)域?qū)ο笤谄渌酆蟽?nèi)維護(hù)生命周期,且在它依附的實(shí)體對(duì)象中只允許整體替換,我們就可以將它設(shè)計(jì)為值對(duì)象。如果這個(gè)對(duì)象是多條且需要基于它做查詢(xún)統(tǒng)計(jì),我建議將它設(shè)計(jì)為實(shí)體

7.如何設(shè)計(jì)一個(gè)聚合:
第 1 步:采用事件風(fēng)暴,根據(jù)業(yè)務(wù)行為,梳理出在投保過(guò)程中發(fā)生這些行為的所有的實(shí)體和值對(duì)象,比如投保單、標(biāo)的、客戶、被保人等等。
第 2 步:從眾多實(shí)體中選出適合作為對(duì)象管理者的根實(shí)體,也就是聚合根。判斷一個(gè)實(shí)體是否是聚合根,你可以結(jié)合以下場(chǎng)景分析:是否有獨(dú)立的生命周期?是否有全局唯一 ID?是否可以創(chuàng)建或修改其它對(duì)象?是否有專(zhuān)門(mén)的模塊來(lái)管這個(gè)實(shí)體。圖中的聚合根分別是投保單和客戶實(shí)體。
第 3 步:根據(jù)業(yè)務(wù)單一職責(zé)和高內(nèi)聚原則,找出與聚合根關(guān)聯(lián)的所有緊密依賴(lài)的實(shí)體和值對(duì)象。構(gòu)建出 1 個(gè)包含聚合根(唯一)、多個(gè)實(shí)體和值對(duì)象的對(duì)象集合,這個(gè)集合就是聚合。在圖中我們構(gòu)建了客戶和投保這兩個(gè)聚合。
第 4 步:在聚合內(nèi)根據(jù)聚合根、實(shí)體和值對(duì)象的依賴(lài)關(guān)系,畫(huà)出對(duì)象的引用和依賴(lài)模型。這里我需要說(shuō)明一下:投保人和被保人的數(shù)據(jù),是通過(guò)關(guān)聯(lián)客戶 ID 從客戶聚合中獲取的,在投保聚合里它們是投保單的值對(duì)象,這些值對(duì)象的數(shù)據(jù)是客戶的冗余數(shù)據(jù),即使未來(lái)客戶聚合的數(shù)據(jù)發(fā)生了變更,也不會(huì)影響投保單的值對(duì)象數(shù)據(jù)。從圖中我們還可以看出實(shí)體之間的引用關(guān)系,比如在投保聚合里投保單聚合根引用了報(bào)價(jià)單實(shí)體,報(bào)價(jià)單實(shí)體則引用了報(bào)價(jià)規(guī)則子實(shí)體。
第 5 步:多個(gè)聚合根據(jù)業(yè)務(wù)語(yǔ)義和上下文一起劃分到同一個(gè)限界上下文內(nèi)。
這就是一個(gè)聚合誕生的完整過(guò)程了。
8.聚合的設(shè)計(jì)原則:
聚合內(nèi)的實(shí)體對(duì)象數(shù)據(jù)一致性,邊界之外的數(shù)據(jù)和聚合內(nèi)的互不影響,也就是說(shuō)一個(gè)聚合內(nèi)的數(shù)據(jù)是一起的
設(shè)計(jì)小聚合,大聚合會(huì)導(dǎo)致實(shí)體太多,高頻操作導(dǎo)致事務(wù)大,并發(fā)等問(wèn)題
聚合之間的關(guān)聯(lián)通過(guò)聚合根ID進(jìn)行關(guān)聯(lián)
通過(guò)應(yīng)用層進(jìn)行領(lǐng)域編排或者通過(guò)事件機(jī)制
9.領(lǐng)域事件:
為了多個(gè)聚合之間的交互方式:1.領(lǐng)域事件 2通過(guò)應(yīng)用層編排
1.領(lǐng)域內(nèi)的事件: 通過(guò)本地事件表存儲(chǔ),通過(guò)eventbus發(fā)布事件
2.領(lǐng)域外的事件: 1.通過(guò)消息隊(duì)列 2.通過(guò)公共的事件庫(kù)通信
二、DDD進(jìn)階:
1.DDD分層架構(gòu):

1.用戶接口層
用戶接口層負(fù)責(zé)向用戶顯示信息和解釋用戶指令。這里的用戶可能是:用戶、程序、自動(dòng)化測(cè)試和批處理腳本等等。
2.應(yīng)用層
應(yīng)用層是很薄的一層,理論上不應(yīng)該有業(yè)務(wù)規(guī)則或邏輯,主要面向用例和流程相關(guān)的操作。但應(yīng)用層又位于領(lǐng)域?qū)又?,因?yàn)轭I(lǐng)域?qū)影鄠€(gè)聚合,所以它可以協(xié)調(diào)多個(gè)聚合的服務(wù)和領(lǐng)域?qū)ο笸瓿煞?wù)編排和組合,協(xié)作完成業(yè)務(wù)操作。此外,應(yīng)用層也是微服務(wù)之間交互的通道,它可以調(diào)用其它微服務(wù)的應(yīng)用服務(wù),完成微服務(wù)之間的服務(wù)組合和編排。這里我要提醒你一下:在設(shè)計(jì)和開(kāi)發(fā)時(shí),不要將本該放在領(lǐng)域?qū)拥臉I(yè)務(wù)邏輯放到應(yīng)用層中實(shí)現(xiàn)。因?yàn)辇嫶蟮膽?yīng)用層會(huì)使領(lǐng)域模型失焦,時(shí)間一長(zhǎng)你的微服務(wù)就會(huì)演化為傳統(tǒng)的三層架構(gòu),業(yè)務(wù)邏輯會(huì)變得混亂。另外,應(yīng)用服務(wù)是在應(yīng)用層的,它負(fù)責(zé)服務(wù)的組合、編排和轉(zhuǎn)發(fā),負(fù)責(zé)處理業(yè)務(wù)用例的執(zhí)行順序以及結(jié)果的拼裝,以粗粒度的服務(wù)通過(guò) API 網(wǎng)關(guān)向前端發(fā)布。還有,應(yīng)用服務(wù)還可以進(jìn)行安全認(rèn)證、權(quán)限校驗(yàn)、事務(wù)控制、發(fā)送或訂閱領(lǐng)域事件等。
3.領(lǐng)域?qū)?/strong>
領(lǐng)域?qū)拥淖饔檬菍?shí)現(xiàn)企業(yè)核心業(yè)務(wù)邏輯,通過(guò)各種校驗(yàn)手段保證業(yè)務(wù)的正確性。領(lǐng)域?qū)又饕w現(xiàn)領(lǐng)域模型的業(yè)務(wù)能力,它用來(lái)表達(dá)業(yè)務(wù)概念、業(yè)務(wù)狀態(tài)和業(yè)務(wù)規(guī)則。領(lǐng)域?qū)影酆细?shí)體、值對(duì)象、領(lǐng)域服務(wù)等領(lǐng)域模型中的領(lǐng)域?qū)ο蟆?/code>這里我要特別解釋一下其中幾個(gè)領(lǐng)域?qū)ο蟮年P(guān)系,以便你在設(shè)計(jì)領(lǐng)域?qū)拥臅r(shí)候能更加清楚。首先,領(lǐng)域模型的業(yè)務(wù)邏輯主要是由實(shí)體和領(lǐng)域服務(wù)來(lái)實(shí)現(xiàn)的,其中實(shí)體會(huì)采用充血模型來(lái)實(shí)現(xiàn)所有與之相關(guān)的業(yè)務(wù)功能。其次,你要知道,實(shí)體和領(lǐng)域服務(wù)在實(shí)現(xiàn)業(yè)務(wù)邏輯上不是同級(jí)的,當(dāng)領(lǐng)域中的某些功能,單一實(shí)體(或者值對(duì)象)不能實(shí)現(xiàn)時(shí),領(lǐng)域服務(wù)就會(huì)出馬,它可以組合聚合內(nèi)的多個(gè)實(shí)體(或者值對(duì)象),實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。
4.基礎(chǔ)層
基礎(chǔ)層是貫穿所有層的,它的作用就是為其它各層提供通用的技術(shù)和基礎(chǔ)服務(wù),包括第三方工具、驅(qū)動(dòng)、消息中間件、網(wǎng)關(guān)、文件、緩存以及數(shù)據(jù)庫(kù)等。比較常見(jiàn)的功能還是提供數(shù)據(jù)庫(kù)持久化?;A(chǔ)層包含基礎(chǔ)服務(wù),它采用依賴(lài)倒置設(shè)計(jì),封裝基礎(chǔ)資源服務(wù),實(shí)現(xiàn)應(yīng)用層、領(lǐng)域?qū)优c基礎(chǔ)層的解耦,降低外部資源變化對(duì)應(yīng)用的影響。比如說(shuō),在傳統(tǒng)架構(gòu)設(shè)計(jì)中,由于上層應(yīng)用對(duì)數(shù)據(jù)庫(kù)的強(qiáng)耦合,很多公司在架構(gòu)演進(jìn)中最擔(dān)憂的可能就是換數(shù)據(jù)庫(kù)了,因?yàn)橐坏└鼡Q數(shù)據(jù)庫(kù),就可能需要重寫(xiě)大部分的代碼,這對(duì)應(yīng)用來(lái)說(shuō)是致命的。那采用依賴(lài)倒置的設(shè)計(jì)以后,應(yīng)用層就可以通過(guò)解耦來(lái)保持獨(dú)立的核心業(yè)務(wù)邏輯。
2.整潔架構(gòu):
整潔架構(gòu)整潔架構(gòu)又名“洋蔥架構(gòu)”。
為什么叫它洋蔥架構(gòu)?
看看下面這張圖你就明白了。整潔架構(gòu)的層就像洋蔥片一樣,它體現(xiàn)了分層的設(shè)計(jì)思想。在整潔架構(gòu)里,同心圓代表應(yīng)用軟件的不同部分,從里到外依次是領(lǐng)域模型、領(lǐng)域服務(wù)、應(yīng)用服務(wù)和最外圍的容易變化的內(nèi)容,比如用戶界面和基礎(chǔ)設(shè)施。整潔架構(gòu)最主要的原則是依賴(lài)原則,它定義了各層的依賴(lài)關(guān)系,越往里依賴(lài)越低,代碼級(jí)別越高,越是核心能力。外圓代碼依賴(lài)只能指向內(nèi)圓,內(nèi)圓不需要知道外圓的任何情況。

在洋蔥架構(gòu)中,各層的職能是這樣劃分的:
領(lǐng)域模型實(shí)現(xiàn)領(lǐng)域內(nèi)核心業(yè)務(wù)邏輯,它封裝了企業(yè)級(jí)的業(yè)務(wù)規(guī)則。領(lǐng)域模型的主體是實(shí)體,一個(gè)實(shí)體可以是一個(gè)帶方法的對(duì)象,也可以是一個(gè)數(shù)據(jù)結(jié)構(gòu)和方法集合。
領(lǐng)域服務(wù)實(shí)現(xiàn)涉及多個(gè)實(shí)體的復(fù)雜業(yè)務(wù)邏輯。應(yīng)用服務(wù)實(shí)現(xiàn)與用戶操作相關(guān)的服務(wù)組合與編排,它包含了應(yīng)用特有的業(yè)務(wù)流程規(guī)則,封裝和實(shí)現(xiàn)了系統(tǒng)所有用例。
最外層主要提供適配的能力,適配能力分為主動(dòng)適配和被動(dòng)適配。主動(dòng)適配主要實(shí)現(xiàn)外部用戶、網(wǎng)頁(yè)、批處理和自動(dòng)化測(cè)試等對(duì)內(nèi)層業(yè)務(wù)邏輯訪問(wèn)適配。被動(dòng)適配主要是實(shí)現(xiàn)核心業(yè)務(wù)邏輯對(duì)基礎(chǔ)資源訪問(wèn)的適配,比如數(shù)據(jù)庫(kù)、緩存、文件系統(tǒng)和消息中間件等。
紅圈內(nèi)的領(lǐng)域模型、領(lǐng)域服務(wù)和應(yīng)用服務(wù)一起組成軟件核心業(yè)務(wù)能力。
-
六邊形架構(gòu)
六邊形架構(gòu)又名“端口適配器架構(gòu)”。追溯微服務(wù)架構(gòu)的淵源,一般都會(huì)涉及到六邊形架構(gòu)。
六邊形架構(gòu)的核心理念是:應(yīng)用是通過(guò)端口與外部進(jìn)行交互的。
我想這也是微服務(wù)架構(gòu)下 API 網(wǎng)關(guān)盛行的主要原因吧。也就是說(shuō),在下圖的六邊形架構(gòu)中,紅圈內(nèi)的核心業(yè)務(wù)邏輯(應(yīng)用程序和領(lǐng)域模型)與外部資源(包括 APP、Web 應(yīng)用以及數(shù)據(jù)庫(kù)資源等)完全隔離,僅通過(guò)適配器進(jìn)行交互。它解決了業(yè)務(wù)邏輯與用戶界面的代碼交錯(cuò)問(wèn)題,很好地實(shí)現(xiàn)了前后端分離。六邊形架構(gòu)各層的依賴(lài)關(guān)系與整潔架構(gòu)一樣,都是由外向內(nèi)依賴(lài)。

六邊形架構(gòu)將系統(tǒng)分為內(nèi)六邊形和外六邊形兩層,這兩層的職能劃分如下:
- 紅圈內(nèi)的六邊形實(shí)現(xiàn)應(yīng)用的核心業(yè)務(wù)邏輯;
- 外六邊形完成外部應(yīng)用、驅(qū)動(dòng)和基礎(chǔ)資源等的交互和訪問(wèn),對(duì)前端應(yīng)用以 API 主動(dòng)適配的方式提供服務(wù),對(duì)基礎(chǔ)資源以依賴(lài)倒置被動(dòng)適配的方式實(shí)現(xiàn)資源訪問(wèn)。
三種微服務(wù)架構(gòu)模型的對(duì)比和分析
雖然 DDD 分層架構(gòu)、整潔架構(gòu)、六邊形架構(gòu)的架構(gòu)模型表現(xiàn)形式不一樣,但你不要被它們的表象所迷惑,這三種架構(gòu)模型的設(shè)計(jì)思想正是微服務(wù)架構(gòu)高內(nèi)聚低耦合原則的完美體現(xiàn),而它們身上閃耀的正是以領(lǐng)域模型為中心的設(shè)計(jì)思想。

我們看下上面這張圖,結(jié)合圖示對(duì)這三種架構(gòu)模型做一個(gè)分析。
請(qǐng)你重點(diǎn)關(guān)注圖中的紅色線框,它們是非常重要的分界線,這三種架構(gòu)里面都有,它的作用就是將核心業(yè)務(wù)邏輯與外部應(yīng)用、基礎(chǔ)資源進(jìn)行隔離。
紅色框內(nèi)部主要實(shí)現(xiàn)核心業(yè)務(wù)邏輯,但核心業(yè)務(wù)邏輯也是有差異的,有的業(yè)務(wù)邏輯屬于領(lǐng)域模型的能力,有的則屬于面向用戶的用例和流程編排能力。按照這種功能的差異,我們?cè)谶@三種架構(gòu)中劃分了應(yīng)用層和領(lǐng)域?qū)?,?lái)承擔(dān)不同的業(yè)務(wù)邏輯。
領(lǐng)域?qū)訉?shí)現(xiàn)面向領(lǐng)域模型,實(shí)現(xiàn)領(lǐng)域模型的核心業(yè)務(wù)邏輯,屬于原子模型,它需要保持領(lǐng)域模型和業(yè)務(wù)邏輯的穩(wěn)定,對(duì)外提供穩(wěn)定的細(xì)粒度的領(lǐng)域服務(wù),所以它處于架構(gòu)的核心位置。
應(yīng)用層實(shí)現(xiàn)面向用戶操作相關(guān)的用例和流程,對(duì)外提供粗粒度的 API 服務(wù)。它就像一個(gè)齒輪一樣進(jìn)行前臺(tái)應(yīng)用和領(lǐng)域?qū)拥倪m配,接收前臺(tái)需求,隨時(shí)做出響應(yīng)和調(diào)整,盡量避免將前臺(tái)需求傳導(dǎo)到領(lǐng)域?qū)?。?yīng)用層作為配速齒輪則位于前臺(tái)應(yīng)用和領(lǐng)域?qū)又g。
可以說(shuō),這三種架構(gòu)都考慮了前端需求的變與領(lǐng)域模型的不變。需求變幻無(wú)窮,但變化總是有矩可循的,用戶體驗(yàn)、操作習(xí)慣、市場(chǎng)環(huán)境以及管理流程的變化,往往會(huì)導(dǎo)致界面邏輯和流程的多變。但總體來(lái)說(shuō),不管前端如何變化,在企業(yè)沒(méi)有大的變革的情況下,核心領(lǐng)域邏輯基本不會(huì)大變,所以領(lǐng)域模型相對(duì)穩(wěn)定,而用例和流程則會(huì)隨著外部應(yīng)用需求而隨時(shí)調(diào)整。把握好這個(gè)規(guī)律,我們就知道該如何設(shè)計(jì)應(yīng)用層和領(lǐng)域?qū)恿恕?/p>
架構(gòu)模型通過(guò)分層的方式來(lái)控制需求變化從外到里對(duì)系統(tǒng)的影響,從外向里受需求影響逐步減小。面向用戶的前端可以快速響應(yīng)外部需求進(jìn)行調(diào)整和發(fā)布,靈活多變,應(yīng)用層通過(guò)服務(wù)組合和編排來(lái)實(shí)現(xiàn)業(yè)務(wù)流程的快速適配上線,減少傳導(dǎo)到領(lǐng)域?qū)拥男枨螅诡I(lǐng)域?qū)颖3珠L(zhǎng)期穩(wěn)定。
融合 DDD、洋蔥架構(gòu)、整潔架構(gòu)、CQRS的清晰架構(gòu)

以下公司在使用DDD:
......
學(xué)習(xí)資料
代碼
https://github.com/alibaba/COLA
https://github.com/xtoon/xtoon-boot-ddd
https://github.com/ouchuangxin/leave-sample