還在搞三層架構(gòu)?DDD 分層架構(gòu)了解下!
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
作者:張曉龍
來源:https://www.jianshu.com/p/a775836c7e25
引言
在討論DDD分層架構(gòu)的模式之前,我們先一起回顧一下DDD和分層架構(gòu)的相關(guān)知識(shí)。
DDD
DDD(Domain DrivenDesign,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))作為一種軟件開發(fā)方法,它可以幫助我們設(shè)計(jì)高質(zhì)量的軟件模型。在正確實(shí)現(xiàn)的情況下,我們通過DDD完成的設(shè)計(jì)恰恰就是軟件的工作方式。
UL(Ubiquitous Language,通用語言)是團(tuán)隊(duì)共享的語言,是DDD中最具威力的特性之一。不管你在團(tuán)隊(duì)中的角色如何,只要你是團(tuán)隊(duì)的一員,你都將使用UL。由于UL的重要性,所以需要讓每個(gè)概念在各自的上下文中是清晰無歧義的,于是DDD在戰(zhàn)略設(shè)計(jì)上提出了模式BC(BoundedContext,限界上下文)。UL和BC同時(shí)構(gòu)成了DDD的兩大支柱,并且它們是相輔相成的,即UL都有其確定的上下文含義,而BC中的每個(gè)概念都有唯一的含義。
一個(gè)業(yè)務(wù)領(lǐng)域劃分成若干個(gè)BC,它們之間通過Context Map進(jìn)行集成。BC是一個(gè)顯式的邊界,領(lǐng)域模型便存在于這個(gè)邊界之內(nèi)。領(lǐng)域模型是關(guān)于某個(gè)特定業(yè)務(wù)領(lǐng)域的軟件模型。通常,領(lǐng)域模型通過對象模型來實(shí)現(xiàn),這些對象同時(shí)包含了數(shù)據(jù)和行為,并且表達(dá)了準(zhǔn)確的業(yè)務(wù)含義。
從廣義上來講,領(lǐng)域即是一個(gè)組織所做的事情以及其中所包含的一切,表示整個(gè)業(yè)務(wù)系統(tǒng)。由于“領(lǐng)域模型”包含了“領(lǐng)域”這個(gè)詞,我們可能會(huì)認(rèn)為應(yīng)該為整個(gè)業(yè)務(wù)系統(tǒng)創(chuàng)建一個(gè)單一的、內(nèi)聚的和全功能式的模型。然而,這并不是我們使用DDD的目標(biāo)。正好相反,領(lǐng)域模型存在于BC內(nèi)。
在微服務(wù)架構(gòu)實(shí)踐中,人們大量地使用了DDD中的概念和技術(shù):
微服務(wù)中應(yīng)該首先建立UL,然后再討論領(lǐng)域模型。
一個(gè)微服務(wù)最大不要超過一個(gè)BC,否則微服務(wù)內(nèi)會(huì)存在有歧義的領(lǐng)域概念。
一個(gè)微服務(wù)最小不要小于一個(gè)聚合,否則會(huì)引入分布式事務(wù)的復(fù)雜度。
微服務(wù)的劃分過程類似于BC的劃分過程,每個(gè)微服務(wù)都有一個(gè)領(lǐng)域模型。
微服務(wù)間的集成可以通過Context Map來完成,比如ACL(Anticorruption Layer,防腐層)。
微服務(wù)間最好采用Domain Event(領(lǐng)域事件)來進(jìn)行交互,使得微服務(wù)可以保持松耦合。
分層架構(gòu)
分層架構(gòu)的一個(gè)重要原則是每層只能與位于其下方的層發(fā)生耦合。分層架構(gòu)可以簡單分為兩種,即嚴(yán)格分層架構(gòu)和松散分層架構(gòu)。在 嚴(yán)格分層架構(gòu)中,某層只能與位于其直接下方的層發(fā)生耦合,而在 松散分層架構(gòu) 中,則允許某層與它的任意下方層發(fā)生耦合。
分層架構(gòu)的好處是顯而易見的。首先,由于層間松散的耦合關(guān)系,使得我們可以專注于本層的設(shè)計(jì),而不必關(guān)心其他層的設(shè)計(jì),也不必?fù)?dān)心自己的設(shè)計(jì)會(huì)影響其它層,對提高軟件質(zhì)量大有裨益。其次,分層架構(gòu)使得程序結(jié)構(gòu)清晰,升級和維護(hù)都變得十分容易,更改某層的具體實(shí)現(xiàn)代碼,只要本層的接口保持穩(wěn)定,其他層可以不必修改。即使本層的接口發(fā)生變化,也只影響相鄰的上層,修改工作量小且錯(cuò)誤可以控制,不會(huì)帶來意外的風(fēng)險(xiǎn)。
要保持程序分層架構(gòu)的優(yōu)點(diǎn),就必須堅(jiān)持層間的松散耦合關(guān)系。設(shè)計(jì)程序時(shí),應(yīng)先劃分出可能的層次,以及此層次提供的接口和需要的接口。設(shè)計(jì)某層時(shí),應(yīng)盡量保持層間的隔離,僅使用下層提供的接口。關(guān)于分層架構(gòu)的優(yōu)點(diǎn),Martin Fowler在《Patterns of Enterprise Application Architecture》一書中給出了答案:
開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的某一層。 可以很容易的用新的實(shí)現(xiàn)來替換原有層次的實(shí)現(xiàn)。 可以降低層與層之間的依賴。 有利于標(biāo)準(zhǔn)化。 利于各層邏輯的復(fù)用。
“金無足赤,人無完人”,分層架構(gòu)也不可避免具有一些缺陷:
降低了系統(tǒng)的性能。這是顯然的,因?yàn)樵黾恿酥虚g層,不過可以通過緩存機(jī)制來改善。 可能會(huì)導(dǎo)致級聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向,不過可以通過依賴倒置來改善。
在每個(gè)BC中為了凸顯領(lǐng)域模型,DDD中提出了分層架構(gòu)模式。最近幾年,筆者在實(shí)踐DDD的過程中,也經(jīng)常使用分層架構(gòu)模式,本文主要分享DDD分層架構(gòu)中比較經(jīng)典的三種模式。另外,關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):設(shè)計(jì)模式,可以獲取我整理的 Java 設(shè)計(jì)模式教程。
模式一:四層架構(gòu)
Eric Evans在《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)-軟件核心復(fù)雜性應(yīng)對之道》這本書中提出了傳統(tǒng)的四層架構(gòu)模式,如下圖所示:

User Interface為用戶界面層(或表示層),負(fù)責(zé)向用戶顯示信息和解釋用戶命令。這里指的用戶可以是另一個(gè)計(jì)算機(jī)系統(tǒng),不一定是使用用戶界面的人。 Application為應(yīng)用層,定義軟件要完成的任務(wù),并且指揮表達(dá)領(lǐng)域概念的對象來解決問題。這一層所負(fù)責(zé)的工作對業(yè)務(wù)來說意義重大,也是與其它系統(tǒng)的應(yīng)用層進(jìn)行交互的必要渠道。應(yīng)用層要盡量簡單,不包含業(yè)務(wù)規(guī)則或者知識(shí),而只為下一層中的領(lǐng)域?qū)ο髤f(xié)調(diào)任務(wù),分配工作,使它們互相協(xié)作。它沒有反映業(yè)務(wù)情況的狀態(tài),但是卻可以具有另外一種狀態(tài),為用戶或程序顯示某個(gè)任務(wù)的進(jìn)度。 Domain為領(lǐng)域?qū)樱ɑ蚰P蛯樱?,?fù)責(zé)表達(dá)業(yè)務(wù)概念,業(yè)務(wù)狀態(tài)信息以及業(yè)務(wù)規(guī)則。盡管保存業(yè)務(wù)狀態(tài)的技術(shù)細(xì)節(jié)是由基礎(chǔ)設(shè)施層實(shí)現(xiàn)的,但是反映業(yè)務(wù)情況的狀態(tài)是由本層控制并且使用的。領(lǐng)域?qū)邮菢I(yè)務(wù)軟件的核心,領(lǐng)域模型位于這一層。 Infrastructure層為基礎(chǔ)實(shí)施層,向其他層提供通用的技術(shù)能力:為應(yīng)用層傳遞消息,為領(lǐng)域?qū)犹峁┏志没瘷C(jī)制,為用戶界面層繪制屏幕組件,等等?;A(chǔ)設(shè)施層還能夠通過架構(gòu)框架來支持四個(gè)層次間的交互模式。傳統(tǒng)的四層架構(gòu)都是 限定型松散分層架構(gòu) ,即Infrastructure層的任意上層都可以訪問該層(“L”型),而其它層遵守 嚴(yán)格分層架構(gòu)
筆者在四層架構(gòu)模式的實(shí)踐中,對于分層的本地化定義主要為:
User Interface層主要是Restful消息處理,配置文件解析,等等。 Application層主要是多進(jìn)程管理及調(diào)度,多線程管理及調(diào)度,多協(xié)程調(diào)度和狀態(tài)機(jī)管理,等等。 Domain層主要是領(lǐng)域模型的實(shí)現(xiàn),包括領(lǐng)域?qū)ο蟮拇_立,這些對象的生命周期管理及關(guān)系,領(lǐng)域服務(wù)的定義,領(lǐng)域事件的發(fā)布,等等。 Infrastructure層主要是業(yè)務(wù)平臺(tái),編程框架,第三方庫的封裝,基礎(chǔ)算法,等等。
說明:嚴(yán)格意義上來說,User Interface指的是用戶界面,Restful消息和配置文件解析等處理應(yīng)該放在Application層,User Interface層沒有的話就空缺。但User Interface也可以理解為用戶接口,所以將Restful消息和配置文件解析等處理放在User Interface層也行。
模式二:五層架構(gòu)
于是我們有了完整的DCI架構(gòu)(Data、Context和Interactive三層架構(gòu)):
Data層描述系統(tǒng)有哪些領(lǐng)域概念及其之間的關(guān)系,該層專注于領(lǐng)域?qū)ο蟮拇_立和這些對象的生命周期管理及關(guān)系,讓程序員站在對象的角度思考系統(tǒng),從而讓“系統(tǒng)是什么”更容易被理解。 Context層:是盡可能薄的一層。Context往往被實(shí)現(xiàn)得無狀態(tài),只是找到合適的role,讓role交互起來完成業(yè)務(wù)邏輯即可。但是簡單并不代表不重要,顯示化context層正是為人去理解軟件業(yè)務(wù)流程提供切入點(diǎn)和主線。 Interactive層主要體現(xiàn)在對role的建模,role是每個(gè)context中復(fù)雜的業(yè)務(wù)邏輯的真正執(zhí)行者,體現(xiàn)“系統(tǒng)做什么”。role所做的是對行為進(jìn)行建模,它聯(lián)接了context和領(lǐng)域?qū)ο蟆S捎谙到y(tǒng)的行為是復(fù)雜且多變的,role使得系統(tǒng)將穩(wěn)定的領(lǐng)域模型層和多變的系統(tǒng)行為層進(jìn)行了分離,由role專注于對系統(tǒng)行為進(jìn)行建模。該層往往關(guān)注于系統(tǒng)的可擴(kuò)展性,更加貼近于軟件工程實(shí)踐,在面向?qū)ο笾懈嗟氖且灶惖囊暯沁M(jìn)行思考設(shè)計(jì)。
DCI目前廣泛被看作是對DDD的一種發(fā)展和補(bǔ)充,用在基于面向?qū)ο蟮念I(lǐng)域建模上。顯式的對role進(jìn)行建模,解決了面向?qū)ο蠼V械某溲P秃拓氀P椭疇?。DCI通過顯式的用role對行為進(jìn)行建模,同時(shí)讓role在context中可以和對應(yīng)的領(lǐng)域?qū)ο筮M(jìn)行綁定(cast),從而既解決了數(shù)據(jù)邊界和行為邊界不一致的問題,也解決了領(lǐng)域?qū)ο笾袛?shù)據(jù)和行為高內(nèi)聚低耦合的問題。
面向?qū)ο蠼C媾R的一個(gè)棘手問題是數(shù)據(jù)邊界和行為邊界往往不一致。遵循模塊化的思想,我們通過類將行為和其緊密耦合的數(shù)據(jù)封裝在一起。但是在復(fù)雜的業(yè)務(wù)場景下,行為往往跨越多個(gè)領(lǐng)域?qū)ο?,這樣的行為如果放在某一個(gè)對象中必然會(huì)導(dǎo)致別的對象需要向該對象暴漏其內(nèi)部狀態(tài)。所以面向?qū)ο蟀l(fā)展的后來,領(lǐng)域建模出現(xiàn)兩種派別之爭,一種傾向于將跨越多個(gè)領(lǐng)域?qū)ο蟮男袨榻T陬I(lǐng)域服務(wù)中。如果這種做法使用過度,則會(huì)導(dǎo)致領(lǐng)域?qū)ο笞兂芍惶峁┮欢裧et方法的啞對象,這種建模結(jié)果被稱之為貧血模型。而另一派則堅(jiān)定的認(rèn)為方法應(yīng)該屬于領(lǐng)域?qū)ο?,所以所有的業(yè)務(wù)行為仍然被放在領(lǐng)域?qū)ο笾?,這樣導(dǎo)致領(lǐng)域?qū)ο箅S著支持的業(yè)務(wù)場景變多而變成上帝類,而且類內(nèi)部方法的抽象層次很難一致。另外由于行為邊界很難恰當(dāng),導(dǎo)致對象之間數(shù)據(jù)訪問關(guān)系也比較復(fù)雜,這種建模結(jié)果被稱之為充血模型。
關(guān)于多角色對象,舉個(gè)生活中的例子:
人有多重角色,不同的角色履行的職責(zé)不同:
作為父母:我們要給孩子講故事,陪他們玩游戲,哄它們睡覺。 作為子女:我們要孝敬父母,聽取他們的人生建議。 作為下屬:我們要服從上司的工作安排,并高質(zhì)量完成任務(wù)。 作為上司:我們要安排下屬的工作,并進(jìn)行培養(yǎng)和激勵(lì)。 …
這里人(大對象)聚合了多個(gè)角色(小類),人在某種場景下,只能扮演特定的角色:
在孩子面前,我們是父母。 在父母面前,我們是子女。 在上司面前,我們是下屬。 在下屬面前,我們是上司。 …
引入DCI后,DDD四層架構(gòu)模式中的Domain層變薄了,以前Domain層對應(yīng)DCI中的三層,而現(xiàn)在:


筆者在實(shí)踐中,將這五層的本地化定義為:
User Interface是用戶接口層,主要用于處理用戶發(fā)送的Restful請求和解析用戶輸入的配置文件等,并將信息傳遞給Application層的接口。 Application層是應(yīng)用層,負(fù)責(zé)多進(jìn)程管理及調(diào)度、多線程管理及調(diào)度、多協(xié)程調(diào)度和維護(hù)業(yè)務(wù)實(shí)例的狀態(tài)模型。當(dāng)調(diào)度層收到用戶接口層的請求后,委托Context層與本次業(yè)務(wù)相關(guān)的上下文進(jìn)行處理。 Context是環(huán)境層,以上下文為單位,將Domain層的領(lǐng)域?qū)ο骳ast成合適的role,讓role交互起來完成業(yè)務(wù)邏輯。 Domain層是領(lǐng)域?qū)?,定義領(lǐng)域模型,不僅包括領(lǐng)域?qū)ο蠹捌渲g關(guān)系的建模,還包括對象的角色role的顯式建模。 Infrastructure層是基礎(chǔ)實(shí)施層,為其他層提供通用的技術(shù)能力:業(yè)務(wù)平臺(tái),編程框架,持久化機(jī)制,消息機(jī)制,第三方庫的封裝,通用算法,等等。
DDD五層架構(gòu)模式討論完了嗎?故事還沒有結(jié)束…
筆者參與的很多DDD落地實(shí)踐,都是面向控制面或管理面且消息交互比較多的系統(tǒng)。這類系統(tǒng)的一次業(yè)務(wù),包含一組同步消息或異步消息構(gòu)成的序列,如果都放在Context層,會(huì)導(dǎo)致該層的代碼比較復(fù)雜,于是我們考慮:
Context層在面向控制面或管理面且消息交互比較多的系統(tǒng)中又分裂成兩層,即Context層和大Context層。 Context層處理單位為Action,對應(yīng)一條同步消息或異步消息。 大Context層對應(yīng)一個(gè)事務(wù)處理,由一個(gè)Action序列組成,一般通過Transaction DSL實(shí)現(xiàn),所以我們習(xí)慣把大Context層叫做Transaction DSL層。 Application層在面向控制面或管理面且消息交互比較多的系統(tǒng)中經(jīng)常會(huì)做一些調(diào)度相關(guān)的工作,所以我們習(xí)慣把Application層叫做Scheduler層。
因此,在面向控制面或管理面且消息交互比較多的系統(tǒng)中,DDD分層架構(gòu)模式就變成了六層,如下圖所示:

筆者在實(shí)踐中,將這六層的本地化定義為:
User Interface是用戶接口層,主要用于處理用戶發(fā)送的Restful請求和解析用戶輸入的配置文件等,并將信息傳遞給Scheduler層的接口。 Scheduler是調(diào)度層,負(fù)責(zé)多進(jìn)程管理及調(diào)度、多線程管理及調(diào)度、多協(xié)程調(diào)度和維護(hù)業(yè)務(wù)實(shí)例的狀態(tài)模型。當(dāng)調(diào)度層收到用戶接口層的請求后,委托Transaction層與本次操作相關(guān)的事務(wù)進(jìn)行處理。 Transaction是事務(wù)層,對應(yīng)一個(gè)業(yè)務(wù)流程,比如UE Attach,將多個(gè)同步消息或異步消息的處理序列組合成一個(gè)事務(wù),而且在大多場景下,都有選擇結(jié)構(gòu)。萬一事務(wù)執(zhí)行失敗,則立即進(jìn)行回滾。當(dāng)事務(wù)層收到調(diào)度層的請求后,委托Context層的Action進(jìn)行處理,常常還伴隨使用Context層的Specification(謂詞)進(jìn)行Action的選擇。 Context是環(huán)境層,以Action為單位,處理一條同步消息或異步消息,將Domain層的領(lǐng)域?qū)ο骳ast成合適的role,讓role交互起來完成業(yè)務(wù)邏輯。環(huán)境層通常也包括Specification的實(shí)現(xiàn),即通過Domain層的知識(shí)去完成一個(gè)條件判斷。 Domain層是領(lǐng)域?qū)?,定義領(lǐng)域模型,不僅包括領(lǐng)域?qū)ο蠹捌渲g關(guān)系的建模,還包括對象的角色role的顯式建模。 Infrastructure層是基礎(chǔ)實(shí)施層,為其他層提供通用的技術(shù)能力:業(yè)務(wù)平臺(tái),編程框架,持久化機(jī)制,消息機(jī)制,第三方庫的封裝,通用算法,等等。
事務(wù)層的核心是事務(wù)模型,事務(wù)模型的框架代碼一般放在基礎(chǔ)設(shè)施層。關(guān)于事務(wù)模型,筆者以前分享過一篇文章— 《Golang事務(wù)模型》 ,感興趣的同學(xué)可以看看。
綜上所述,DDD六層架構(gòu)可以看做是DDD五層架構(gòu)在特定領(lǐng)域的變體,我們統(tǒng)稱為DDD五層架構(gòu),而DDD五層架構(gòu)與傳統(tǒng)的四層架構(gòu)類似,都是限定型松散分層架構(gòu) 。
最新Java 技術(shù)教程整理:https://github.com/javastacks/javastack
模式三:六邊形架構(gòu)
有一種方法可以改進(jìn)分層架構(gòu),即依賴倒置原則(Dependency Inversion Principle,DIP),它通過改變不同層之間的依賴關(guān)系達(dá)到改進(jìn)目的。
依賴倒置原則由Robert C. Martin提出,正式定義為:高層模塊不應(yīng)該依賴于底層模塊,兩者都應(yīng)該依賴于抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。
根據(jù)該定義,DDD分層架構(gòu)中的低層組件應(yīng)該依賴于高層組件提供的接口,即無論高層還是低層都依賴于抽象,整個(gè)分層架構(gòu)好像被推平了。如果我們把分層架構(gòu)推平,再向其中加入一些對稱性,就會(huì)出現(xiàn)一種具有對稱性特征的架構(gòu)風(fēng)格,即六邊形架構(gòu)。六邊形架構(gòu)是AlistairCockburn在2005年提出的,在這種架構(gòu)中,不同的客戶通過“平等”的方式與系統(tǒng)交互。需要新的客戶嗎?不是問題。只需要添加一個(gè)新的適配器將客戶輸入轉(zhuǎn)化成能被系統(tǒng)API所理解的參數(shù)就行。同時(shí),對于每種特定的輸出,都有一個(gè)新建的適配器負(fù)責(zé)完成相應(yīng)的轉(zhuǎn)化功能。
六邊形架構(gòu)也稱為端口與適配器,如下圖所示:

六邊形每條不同的邊代表了不同類型的端口,端口要么處理輸入,要么處理輸出。對于每種外界類型,都有一個(gè)適配器與之對應(yīng),外界通過應(yīng)用層API與內(nèi)部進(jìn)行交互。上圖中有3個(gè)客戶請求均抵達(dá)相同的輸入端口(適配器A、B和C),另一個(gè)客戶請求使用了適配器D。假設(shè)前3個(gè)請求使用了HTTP協(xié)議(瀏覽器、REST和SOAP等),而后一個(gè)請求使用了AMQP協(xié)議(比如RabbitMQ)。端口并沒有明確的定義,它是一個(gè)非常靈活的概念。無論采用哪種方式對端口進(jìn)行劃分,當(dāng)客戶請求到達(dá)時(shí),都應(yīng)該有相應(yīng)的適配器對輸入進(jìn)行轉(zhuǎn)化,然后端口將調(diào)用應(yīng)用程序的某個(gè)操作或者向應(yīng)用程序發(fā)送一個(gè)事件,控制權(quán)由此交給內(nèi)部區(qū)域。
應(yīng)用程序通過公共API接收客戶請求,使用領(lǐng)域模型來處理請求。我們可以將DDD戰(zhàn)術(shù)設(shè)計(jì)的建模元素Repository的實(shí)現(xiàn)看作是持久化適配器,該適配器用于訪問先前存儲(chǔ)的聚合實(shí)例或者保存新的聚合實(shí)例。正如圖中的適配器E、F和G所展示的,我們可以通過不同的方式實(shí)現(xiàn)資源庫,比如關(guān)系型數(shù)據(jù)庫、基于文檔的存儲(chǔ)、分布式緩存或內(nèi)存存儲(chǔ)等。如果應(yīng)用程序向外界發(fā)送領(lǐng)域事件消息,我們將使用適配器H進(jìn)行處理。該適配器處理消息輸出,而上面提到的處理AMQP消息的適配器則是處理消息輸入的,因此應(yīng)該使用不同的端口。
我們在實(shí)際的項(xiàng)目開發(fā)中,不同層的組件可以同時(shí)開發(fā)。當(dāng)一個(gè)組件的功能明確后,就可以立即啟動(dòng)開發(fā)。由于該組件的用戶有多個(gè),并且這些用戶的側(cè)重點(diǎn)不同,所以需要提供多個(gè)不同的接口。同時(shí),這些用戶的認(rèn)識(shí)也是不斷深入的,可能會(huì)多次重構(gòu)相關(guān)的接口。于是,組件的多個(gè)用戶經(jīng)常會(huì)找組件的開發(fā)者討論這些問題,無形中降低了組件的開發(fā)效率。
我們換一種方式,組件的開發(fā)者在明確了組件的功能后就專注于功能的開發(fā),確保功能穩(wěn)定和高效。組件的用戶自己定義組件的接口(端口),然后基于接口寫測試,并不斷演進(jìn)接口。在跨層集成測試時(shí),由組件開發(fā)者或用戶再開發(fā)一個(gè)適配器就可以了。
六邊形架構(gòu)模式的演變
盡管六邊形架構(gòu)模式已經(jīng)很好,但是沒有最好只有更好,演變沒有盡頭。在六邊形架構(gòu)模式提出后的這些年,又依次衍生出三種六邊形架構(gòu)模式的變體,感興趣的讀者可以點(diǎn)擊鏈接自行學(xué)習(xí):
Jeffrey Palermo在2008年提出了 洋蔥架構(gòu) ,六邊形架構(gòu)是洋蔥架構(gòu)的一個(gè)超集。 Robert C. Martin在2012年提出了 干凈架構(gòu) (Clean Architecture),這是六邊形架構(gòu)的一個(gè)變體。 Russ Miles在2013年提出了 Life Preserver 設(shè)計(jì),這是一種基于六邊形架構(gòu)的設(shè)計(jì)。
小結(jié)
本文先和讀者一起回顧了DDD和分層架構(gòu)的相關(guān)知識(shí),然后將DDD分層架構(gòu)中常用的三種模式(四層架構(gòu)、五層架構(gòu)和六邊形架構(gòu))結(jié)合實(shí)踐經(jīng)驗(yàn)分別進(jìn)行詳細(xì)闡述,使得讀者深刻理解DDD分層架構(gòu)模式,以便在微服務(wù)的開發(fā)實(shí)踐中根據(jù)具體情況選擇最合適的DDD分層架構(gòu)模式,從而交付結(jié)構(gòu)清晰且易維護(hù)的軟件產(chǎn)品。
最后,關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。






關(guān)注Java技術(shù)??锤喔韶?/strong>


