一、Why DDD惠桃?
在加入X公司后辖试,開(kāi)始了ASP.NET Core+Docker+Linux的技術(shù)實(shí)踐,也開(kāi)始了微服務(wù)架構(gòu)的實(shí)踐呐馆。在微服務(wù)的學(xué)習(xí)中汹来,有一本微軟官方出品的《.NET微服務(wù):容器化.NET應(yīng)用架構(gòu)指南》是我們學(xué)習(xí)的葵花寶典改艇,縱觀微軟官方放出來(lái)的Demo項(xiàng)目的演變歷史(可以參見(jiàn)楊曉東《我眼中的ASP.NET Core微服務(wù)》一文):
≮诵帧(1)PetShop:WebForm 的示例程序。典型的三層架構(gòu)風(fēng)格的應(yīng)用程序邻耕。
(2)MusicStore: 針對(duì)于 MVC3~5 框架和 EF 的一個(gè)示例程序啼辣。無(wú)明顯架構(gòu)風(fēng)格熙兔。
“铡(3)eShop: 針對(duì)于 ASP.NET Core 的示例程序钠绍,它是一個(gè) REST架構(gòu)風(fēng)格的應(yīng)用程序。
分析其架構(gòu)風(fēng)格的轉(zhuǎn)變可以看出媳握,現(xiàn)代應(yīng)用程序架構(gòu)已經(jīng)從單一的傳統(tǒng)風(fēng)格架構(gòu)(N-Layered)轉(zhuǎn)向了多種混合風(fēng)格架構(gòu)(Mixed-Style)磷脯,像最新的eShopOnWeb/Container項(xiàng)目就包含了以下多種架構(gòu)風(fēng)格:
我們可以看到赵誓,其中主要包括了以下兩種架構(gòu)風(fēng)格(雖然看起來(lái)好像有四種):
基于數(shù)據(jù)驅(qū)動(dòng)的CRUD微服務(wù) (比如上圖中Catalog Microservice和Basket Microservice)
基于DDD的微服務(wù)(比如上圖中的Ordering Microservice 訂單微服務(wù))
目前俩功,我所在的開(kāi)發(fā)團(tuán)隊(duì)仍然在使用第一種-基于數(shù)據(jù)驅(qū)動(dòng)的CRUD微服務(wù)诡蜓,而要面對(duì)的業(yè)務(wù)卻逐步變得復(fù)雜,已經(jīng)強(qiáng)烈感到數(shù)據(jù)驅(qū)動(dòng)的復(fù)雜度椿肩、不好維護(hù)度以及溝通成本豺谈,因此需要了解一下為復(fù)雜業(yè)務(wù)而生的DDD核无。不可否認(rèn),很多人是因?yàn)槲⒎?wù)才來(lái)了解 DDD 的(沒(méi)錯(cuò)噪沙,說(shuō)的就是我)。
來(lái)自ThoughtWorks的咨詢(xún)師王威說(shuō)道:在聽(tīng)說(shuō)了微服務(wù)架構(gòu)之后辐马,人們覺(jué)得采用微服務(wù)架構(gòu)會(huì)讓系統(tǒng)開(kāi)發(fā)與運(yùn)維管理變得簡(jiǎn)單高效喜爷,同時(shí)實(shí)現(xiàn)的系統(tǒng)會(huì)更加合理萄唇,更加高可用另萤、高性能,但是當(dāng)他們實(shí)際去做微服務(wù)架構(gòu)的時(shí)候泛源,有不少人會(huì)發(fā)現(xiàn)自己做得并不好忿危,沒(méi)法取得人們“吹捧”的那些效果达箍,“就算用了微服務(wù)架構(gòu)也不能解決他們的問(wèn)題,反而帶來(lái)很多開(kāi)發(fā)與運(yùn)維上的負(fù)擔(dān)”铺厨。于是他們?nèi)プ稍?xún)缎玫、去找方法,最后發(fā)現(xiàn)其實(shí)是自己劃分微服務(wù)的方法出錯(cuò)了努释,這個(gè)時(shí)候才知道人們?cè)谡務(wù)撐⒎?wù)的時(shí)候,其實(shí)都沒(méi)有講到一個(gè)點(diǎn):應(yīng)該用 DDD 的思想去指導(dǎo)微服務(wù)的實(shí)踐咬摇。
那么伐蒂,DDD又是什么呢?
DDD 是一種在面向高度復(fù)雜的軟件系統(tǒng)時(shí)肛鹏,關(guān)于如何去建模的方法論,“它的關(guān)鍵點(diǎn)是根據(jù)系統(tǒng)的復(fù)雜程度在扰,建立合適的模型”缕减。在一個(gè)系統(tǒng)中,沒(méi)有一個(gè)人能完全掌握系統(tǒng)的全貌芒珠,在多人參與的系統(tǒng)中桥狡,DDD 正是可以通過(guò)在不同角色之間進(jìn)行協(xié)作,使參與者達(dá)成統(tǒng)一認(rèn)知,對(duì)齊系統(tǒng)設(shè)計(jì)與程序?qū)嶋H所服務(wù)的業(yè)務(wù)領(lǐng)域裹芝。
摘自 ThoughtWorks資深咨詢(xún)師?Alberto Brandolini
從上圖中來(lái)看DDD 的一個(gè)生命周期大概是這樣的:在設(shè)計(jì)和實(shí)現(xiàn)一個(gè)系統(tǒng)的時(shí)候部逮,這個(gè)系統(tǒng)所要處理問(wèn)題的領(lǐng)域?qū)<液烷_(kāi)發(fā)人員以一套統(tǒng)一語(yǔ)言進(jìn)行協(xié)作,共同完成該領(lǐng)域模型的構(gòu)建嫂易,在這個(gè)過(guò)程中兄朋,業(yè)務(wù)架構(gòu)和系統(tǒng)架構(gòu)等問(wèn)題都得到了解決,之后將領(lǐng)域模型中關(guān)于系統(tǒng)架構(gòu)的主體映射為實(shí)現(xiàn)代碼怜械,完成系統(tǒng)的實(shí)現(xiàn)落地颅和。而用什么方式去做領(lǐng)域模型的構(gòu)建,方法是多樣的缕允,看具體選擇了峡扩。
這里有3個(gè)要點(diǎn),借助專(zhuān)家之眼來(lái)看看:
首先灼芭,在 DDD 中有额,使用一個(gè)統(tǒng)一語(yǔ)言,可以直接將業(yè)務(wù)架構(gòu)與系統(tǒng)架構(gòu)綁定彼绷,不需要進(jìn)一步去翻譯巍佑,從而增強(qiáng)系統(tǒng)對(duì)業(yè)務(wù)的響應(yīng)速度。
其次寄悯,DDD 關(guān)注的是要構(gòu)建的系統(tǒng)中萤衰,關(guān)于所要解決的問(wèn)題的業(yè)務(wù)、流程和數(shù)據(jù)等內(nèi)容是如何工作的猜旬,在這些東西理清之后脆栋,DDD 去構(gòu)建出一個(gè)模型,接著再去選擇具體的實(shí)現(xiàn)技術(shù)洒擦。DDD 強(qiáng)調(diào)的是解耦具體實(shí)現(xiàn)技術(shù)椿争,所以它可以迅速梳理核心業(yè)務(wù)邏輯。
最后熟嫩,DDD 并不是直接給你建議某一個(gè)系統(tǒng)架構(gòu)秦踪,它的執(zhí)行結(jié)果是呈現(xiàn)一個(gè)方案,可以從這個(gè)構(gòu)建出的模型中決定你去用什么技術(shù)來(lái)實(shí)現(xiàn)什么樣的架構(gòu)掸茅,進(jìn)而來(lái)完成一個(gè)系統(tǒng)的設(shè)計(jì)椅邓。備選的各種技術(shù)只是像一個(gè)列表一樣擺在眼前,它要根據(jù)你的領(lǐng)域需求來(lái)選擇昧狮,比如“選擇采用微服務(wù)架構(gòu)”景馁。
二、精華筆記
--下面考慮到閱讀體驗(yàn)逗鸣,將其分為兩個(gè)Part的導(dǎo)圖合住。
2.1 Part 1
2.2 Part 2
完整版思維導(dǎo)圖瀏覽地址:點(diǎn)此瀏覽ProcessOn大圖
三绰精、后續(xù)學(xué)習(xí)
本次學(xué)習(xí)只是一個(gè)簡(jiǎn)單的DDD的相關(guān)基礎(chǔ)理論學(xué)習(xí),后續(xù)會(huì)閱讀Scott Millett和Nick Tune編著的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)模式聊疲、原理與實(shí)踐》一書(shū)進(jìn)行深入學(xué)習(xí)茬底,然后會(huì)研究經(jīng)典DDD分層架構(gòu)與eShopOnContainers示例項(xiàng)目中的簡(jiǎn)化DDD微服務(wù)架構(gòu),最后也會(huì)總結(jié)一下要點(diǎn)分享出來(lái)获洲。
參考資料
顏圣杰阱表,《DDD理論學(xué)習(xí)系列文章》
Alberto Brandolini、王威贡珊,《不用DDD最爬,那你的微服務(wù)可能都做錯(cuò)了》