DDD興起的原因以及與微服務(wù)的關(guān)系
時(shí)間:2021-08-19 16:27:59
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]作者:等不到的口琴來(lái)源:https://www.cnblogs.com/Courage129/p/14839544.htmlDDD為什么能火起來(lái)?我們先不討論DDD的定義,先梳理一下DDD火起來(lái)的背景,根據(jù)我學(xué)習(xí)的套路,永遠(yuǎn)是為什么為先,再是解決什么問(wèn)題,是什么東西,最后如何使用...
作者:等不到的口琴來(lái)源:https://www.cnblogs.com/Courage129/p/14839544.htmlDDD為什么能火起來(lái)?
我們先不討論DDD的定義, 先梳理一下DDD火起來(lái)的背景, 根據(jù)我學(xué)習(xí)的套路, 永遠(yuǎn)是為什么為先,再是解決什么問(wèn)題,是什么東西, 最后如何使用。我們都知道這些年隨著設(shè)備以及技術(shù)的發(fā)展,軟件架構(gòu)發(fā)生了很多變化,從最初的單機(jī)(BS/CS)架構(gòu)到后面的集中式架構(gòu),再到如今的微服務(wù)架構(gòu), 現(xiàn)在基本可以說(shuō)是微服務(wù)架構(gòu)盛行的時(shí)代, DDD早在2004年就由埃里克·埃文斯提出, 但一直處于一個(gè)不慍不火的狀態(tài),直到Martin Fowler的《Microservices》引起大家注意, 也就是微服務(wù)盛行之后(這兒需要說(shuō)明的是,微服務(wù)最早的提出者不是Martin Fowler,而是Fred George), DDD再次回到人們視野中間,為什么呢 ?我們先看一下三種技術(shù)架構(gòu)的演進(jìn)以及主要區(qū)別:
第一階段是單機(jī)架構(gòu),特征是整個(gè)開(kāi)發(fā)圍繞著數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì)和開(kāi)發(fā)。 第二個(gè)階段是三層式的集中式架構(gòu),采用面向?qū)ο蟮脑O(shè)計(jì)方法,業(yè)務(wù)邏輯分業(yè)務(wù)層、邏輯層、數(shù)據(jù)訪問(wèn)層,這種架構(gòu)很容易某一層或者幾層變得臃腫,擴(kuò)展性較差, 另外摩爾定律失效, 單臺(tái)機(jī)器性能有限。 第三層階段是微服務(wù)架構(gòu),在集中式架構(gòu)中, 系統(tǒng)分析、設(shè)計(jì)和開(kāi)發(fā)往往是獨(dú)立進(jìn)行的,而且各個(gè)階段負(fù)責(zé)人可能不一樣,那么就涉及到交流信息丟失的問(wèn)題, 另外項(xiàng)目從分析到開(kāi)發(fā)經(jīng)歷的流程很長(zhǎng),很容易最終開(kāi)發(fā)設(shè)計(jì)與需求實(shí)現(xiàn)的不一樣,微服務(wù)主要就是解決第二階段的這些痛點(diǎn),實(shí)現(xiàn)應(yīng)用之間的解耦,解決單體應(yīng)用擴(kuò)展性的問(wèn)題。微服務(wù)存在的問(wèn)題 進(jìn)入微服務(wù)之后 , 解決了集中式架構(gòu)的單體應(yīng)用很多問(wèn)題, 但是新的問(wèn)題應(yīng)運(yùn)而生 , 微服務(wù)的粒度應(yīng)該多大 ?微服務(wù)如何設(shè)計(jì)呢?微服務(wù)如何拆分 ?微服務(wù)邊界在哪里 ? 很長(zhǎng)時(shí)間人們都沒(méi)有解決這一問(wèn)題,就連Martin Fowler在提出微服務(wù)架構(gòu)的時(shí)候也沒(méi)有告訴我們這該如何拆分微服務(wù)。 甚至在很長(zhǎng)的時(shí)間里人們對(duì)微服務(wù)拆分產(chǎn)生了一些誤解, 有人認(rèn)為:"微服務(wù)很簡(jiǎn)單,就是將之前的單體應(yīng)用拆分成多個(gè)部署包, 或者將原來(lái)的單體應(yīng)用架構(gòu)替換為一套支持微服務(wù)的技術(shù)架構(gòu),就算是微服務(wù)了。" 還有人認(rèn)為微服務(wù)應(yīng)該拆分得越小越好。 鑒于上述情形, 很多項(xiàng)目因?yàn)榍捌诓鸱诌^(guò)度, 導(dǎo)致復(fù)雜度過(guò)高, 導(dǎo)致后期難以運(yùn)維甚至難以上線。 可以得出一個(gè)結(jié)論:微服務(wù)拆分困境產(chǎn)生的根本原因就是不知道業(yè)務(wù)或者微服務(wù)的邊界到底在什么地方。換句話(huà)說(shuō),確定了業(yè)務(wù)邊界和應(yīng)用邊界,這個(gè)困境也就迎刃而解了。 而DDD就是解決了這個(gè)確定業(yè)務(wù)邊界的問(wèn)題,可見(jiàn)DDD并不是一種技術(shù)架構(gòu),而是一種劃分業(yè)務(wù)領(lǐng)域范圍的方法論。DDD的興起是由于很多熟悉領(lǐng)域驅(qū)動(dòng)建模(DDD)的工程師在進(jìn)行微服務(wù)設(shè)計(jì)時(shí), 發(fā)現(xiàn)用DDD的思路進(jìn)行業(yè)務(wù)梳理可以很好規(guī)劃服務(wù)邊界, 可以很好實(shí)現(xiàn)微服務(wù)內(nèi)部和外部的"高內(nèi)聚、低耦合"。于是越來(lái)越多的人將DDD作為業(yè)務(wù)劃分的指導(dǎo)思想。 那么,什么是DDD呢? DDD概述 通過(guò)上文的學(xué)習(xí)就可以知道DDD是一種拆解業(yè)務(wù)、劃分業(yè)務(wù)、確定業(yè)務(wù)邊界的方法, 是一種高度復(fù)雜的領(lǐng)域設(shè)計(jì)思想,將我們的問(wèn)題拆分成一個(gè)個(gè)的域, 試圖分離技術(shù)實(shí)現(xiàn)的復(fù)雜性,主要解決的是軟件難以理解難以演進(jìn)的問(wèn)題,DDD不是一種架構(gòu), 而是一種架構(gòu)方法論, 目的就是將復(fù)雜問(wèn)題領(lǐng)域簡(jiǎn)單化, 幫助我們?cè)O(shè)計(jì)出清晰的領(lǐng)域和邊界, 可以很好的實(shí)現(xiàn)技術(shù)架構(gòu)的演進(jìn)。DDD包括兩部分,戰(zhàn)略設(shè)計(jì)部分和戰(zhàn)術(shù)設(shè)計(jì)部分 戰(zhàn)略設(shè)計(jì)主要從業(yè)務(wù)視角出發(fā),建立業(yè)務(wù)領(lǐng)域模型,劃分領(lǐng)域邊界,建立通用語(yǔ)言的限界上下文,限界上下文可以作為微服務(wù)設(shè)計(jì)的參考邊界。 戰(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)。 DDD戰(zhàn)略設(shè)計(jì)會(huì)建立領(lǐng)域模型, 這四個(gè)字放一起會(huì)讓人覺(jué)得很高深, 其實(shí)是紙老虎, 通俗來(lái)說(shuō)就是模擬某個(gè)領(lǐng)域的的一種模型, 這個(gè)模型比較抽象, 但便于人們交流, 舉個(gè)例子:公園有一棵桃樹(shù), 如果我們想好好研究桃樹(shù)該怎么研究 ? 桃子好吃嗎?貴不貴?品種?怎么種植?種在什么地方 ?做成桃木劍?桃子樹(shù)葉藥用價(jià)值? 你看, 這樣研究每一個(gè)問(wèn)題都很有道理, 但是又很混亂,再回憶一下初中生物書(shū)上是這么研究的? 先將植物根據(jù)大家的理解分成多個(gè)器官組成, 像桃子、桃葉、桃花等等, 然后將每一個(gè)器官再根據(jù)功能細(xì)分成組織, 再根據(jù)這個(gè)組織中各個(gè)細(xì)胞的形態(tài)等作用分成不同的細(xì)胞, 你看看這是不是一種很有條理的分析方法。 
DDD也是如此, 當(dāng)我們面對(duì)桃樹(shù)這種復(fù)雜的業(yè)務(wù)的時(shí)候,先根據(jù)固有的認(rèn)識(shí)分成多個(gè)器官(領(lǐng)域),然后再在每一個(gè)領(lǐng)域中根據(jù)某些維度(這兒是功能)分為多個(gè)組織(聚合), 而每一個(gè)組織中由很多細(xì)胞(實(shí)體)組成,這就是一種戰(zhàn)略, 有哪些好處呢 ?可以確保我們討論的邊界, 也就是討論的東西是一個(gè)領(lǐng)域一個(gè)維度的, 對(duì)于桃樹(shù)來(lái)說(shuō), 桃子 、桃花、桃葉、樹(shù)干都是不同的領(lǐng)域, 劃分不同領(lǐng)域的就是邊界, 我們這兒叫領(lǐng)域邊界, 當(dāng)我們確定好這些領(lǐng)域之后, 就可以確保我們討論的是同一個(gè)領(lǐng)域部分的東西,這樣的好處就是我們可以規(guī)定好一些概念, 或者說(shuō)術(shù)語(yǔ), 以后大家討論的時(shí)候就盡可能少的信息丟失。 DDD戰(zhàn)略設(shè)計(jì)會(huì)建立領(lǐng)域模型 , 領(lǐng)域模型用來(lái)指導(dǎo)微服務(wù)的設(shè)計(jì)和拆分, DDD第一步要做的就是來(lái)一個(gè)頭腦風(fēng)暴, 可以理解成一起討論對(duì)業(yè)務(wù)的理解 , 主要目的就是盡可能前面不遺漏的分解我們的業(yè)務(wù)領(lǐng)域, 就好比剛剛的桃樹(shù), 最先要做的就是盡可能多的分析, 確保每一個(gè)領(lǐng)域都可以被關(guān)注到, 在實(shí)踐中 ,往往會(huì)采用用例分析、場(chǎng)景分析和用戶(hù)旅程分析, 這是一個(gè)發(fā)散的過(guò)程,頭腦風(fēng)暴階段會(huì)產(chǎn)生很多實(shí)體、命令、事件等領(lǐng)域?qū)ο螅?我們從不同的維度對(duì)進(jìn)行聚類(lèi)形成聚合、限界上下文等邊界,建立領(lǐng)域模型, 這是一個(gè)收斂的過(guò)程。
具體來(lái)說(shuō), 我們可以通過(guò)三步來(lái)確定領(lǐng)域模型和微服務(wù)邊界。
第一步:在事件風(fēng)暴中梳理業(yè)務(wù)過(guò)程中的用戶(hù)操作、事件以及外部依賴(lài)關(guān)系等,根據(jù)這些要素梳理出領(lǐng)域?qū)嶓w等領(lǐng)域?qū)ο蟆?/span> 第二步:根據(jù)領(lǐng)域?qū)嶓w之間的業(yè)務(wù)關(guān)聯(lián)性,將業(yè)務(wù)緊密相關(guān)的實(shí)體進(jìn)行組合形成聚合,同時(shí)確定聚合中的聚合根、值對(duì)象和實(shí)體。在這個(gè)圖里,聚合之間的邊界是第一層邊界,它們?cè)谕粋€(gè)微服務(wù)實(shí)例中運(yùn)行,這個(gè)邊界是邏輯邊界,所以用虛線表示。 第三步:根據(jù)業(yè)務(wù)及語(yǔ)義邊界等因素,將一個(gè)或者多個(gè)聚合劃定在一個(gè)限界上下文內(nèi),形成領(lǐng)域模型。在這個(gè)圖里,限界上下文之間的邊界是第二層邊界,這一層邊界可能就是未來(lái)微服務(wù)的邊界,不同限界上下文內(nèi)的領(lǐng)域邏輯被隔離在不同的微服務(wù)實(shí)例中運(yùn)行,物理上相互隔離,所以是物理邊界,邊界之間用實(shí)線來(lái)表示。 上面除了領(lǐng)域、聚合、實(shí)體外還出現(xiàn)了聚合根、值對(duì)象等詞語(yǔ), 除此之外還有統(tǒng)一建模語(yǔ)言、子域、核心域、通用域、支撐域等, 其實(shí)都是紙老虎, 前面說(shuō)過(guò)了為了方便對(duì)于某個(gè)領(lǐng)域的討論往往會(huì)形成一些概念,這些概念會(huì)有一些名詞概括, 上面的名詞就是這么來(lái)的, 這就叫統(tǒng)一建模語(yǔ)言 , 哈哈哈 ,好了,不扯淡, 我后面的文章會(huì)解釋下這些詞語(yǔ)的意思, 這兒主要討論DDD解決什么了問(wèn)題。 梳理一下DDD與微服務(wù)的關(guān)系, DDD 是一種架構(gòu)設(shè)計(jì)方法,微服務(wù)是一種架構(gòu)風(fēng)格,兩者從本質(zhì)上都是為了追求高響應(yīng)力,而從業(yè)務(wù)視角去分離應(yīng)用系統(tǒng)建設(shè)復(fù)雜度的手段。兩者都強(qiáng)調(diào)從業(yè)務(wù)出發(fā),其核心要義是強(qiáng)調(diào)根據(jù)業(yè)務(wù)發(fā)展,合理劃分領(lǐng)域邊界,持續(xù)調(diào)整現(xiàn)有架構(gòu),優(yōu)化現(xiàn)有代碼,以保持架構(gòu)
和代碼的生命力,也就是我們常說(shuō)的演進(jìn)式架構(gòu)。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)建和部署。
我們先不討論DDD的定義, 先梳理一下DDD火起來(lái)的背景, 根據(jù)我學(xué)習(xí)的套路, 永遠(yuǎn)是為什么為先,再是解決什么問(wèn)題,是什么東西, 最后如何使用。我們都知道這些年隨著設(shè)備以及技術(shù)的發(fā)展,軟件架構(gòu)發(fā)生了很多變化,從最初的單機(jī)(BS/CS)架構(gòu)到后面的集中式架構(gòu),再到如今的微服務(wù)架構(gòu), 現(xiàn)在基本可以說(shuō)是微服務(wù)架構(gòu)盛行的時(shí)代, DDD早在2004年就由埃里克·埃文斯提出, 但一直處于一個(gè)不慍不火的狀態(tài),直到Martin Fowler的《Microservices》引起大家注意, 也就是微服務(wù)盛行之后(這兒需要說(shuō)明的是,微服務(wù)最早的提出者不是Martin Fowler,而是Fred George), DDD再次回到人們視野中間,為什么呢 ?我們先看一下三種技術(shù)架構(gòu)的演進(jìn)以及主要區(qū)別:


DDD也是如此, 當(dāng)我們面對(duì)桃樹(shù)這種復(fù)雜的業(yè)務(wù)的時(shí)候,先根據(jù)固有的認(rèn)識(shí)分成多個(gè)器官(領(lǐng)域),然后再在每一個(gè)領(lǐng)域中根據(jù)某些維度(這兒是功能)分為多個(gè)組織(聚合), 而每一個(gè)組織中由很多細(xì)胞(實(shí)體)組成,這就是一種戰(zhàn)略, 有哪些好處呢 ?可以確保我們討論的邊界, 也就是討論的東西是一個(gè)領(lǐng)域一個(gè)維度的, 對(duì)于桃樹(shù)來(lái)說(shuō), 桃子 、桃花、桃葉、樹(shù)干都是不同的領(lǐng)域, 劃分不同領(lǐng)域的就是邊界, 我們這兒叫領(lǐng)域邊界, 當(dāng)我們確定好這些領(lǐng)域之后, 就可以確保我們討論的是同一個(gè)領(lǐng)域部分的東西,這樣的好處就是我們可以規(guī)定好一些概念, 或者說(shuō)術(shù)語(yǔ), 以后大家討論的時(shí)候就盡可能少的信息丟失。 DDD戰(zhàn)略設(shè)計(jì)會(huì)建立領(lǐng)域模型 , 領(lǐng)域模型用來(lái)指導(dǎo)微服務(wù)的設(shè)計(jì)和拆分, DDD第一步要做的就是來(lái)一個(gè)頭腦風(fēng)暴, 可以理解成一起討論對(duì)業(yè)務(wù)的理解 , 主要目的就是盡可能前面不遺漏的分解我們的業(yè)務(wù)領(lǐng)域, 就好比剛剛的桃樹(shù), 最先要做的就是盡可能多的分析, 確保每一個(gè)領(lǐng)域都可以被關(guān)注到, 在實(shí)踐中 ,往往會(huì)采用用例分析、場(chǎng)景分析和用戶(hù)旅程分析, 這是一個(gè)發(fā)散的過(guò)程,頭腦風(fēng)暴階段會(huì)產(chǎn)生很多實(shí)體、命令、事件等領(lǐng)域?qū)ο螅?我們從不同的維度對(duì)進(jìn)行聚類(lèi)形成聚合、限界上下文等邊界,建立領(lǐng)域模型, 這是一個(gè)收斂的過(guò)程。

第一步:在事件風(fēng)暴中梳理業(yè)務(wù)過(guò)程中的用戶(hù)操作、事件以及外部依賴(lài)關(guān)系等,根據(jù)這些要素梳理出領(lǐng)域?qū)嶓w等領(lǐng)域?qū)ο蟆?/span> 第二步:根據(jù)領(lǐng)域?qū)嶓w之間的業(yè)務(wù)關(guān)聯(lián)性,將業(yè)務(wù)緊密相關(guān)的實(shí)體進(jìn)行組合形成聚合,同時(shí)確定聚合中的聚合根、值對(duì)象和實(shí)體。在這個(gè)圖里,聚合之間的邊界是第一層邊界,它們?cè)谕粋€(gè)微服務(wù)實(shí)例中運(yùn)行,這個(gè)邊界是邏輯邊界,所以用虛線表示。 第三步:根據(jù)業(yè)務(wù)及語(yǔ)義邊界等因素,將一個(gè)或者多個(gè)聚合劃定在一個(gè)限界上下文內(nèi),形成領(lǐng)域模型。在這個(gè)圖里,限界上下文之間的邊界是第二層邊界,這一層邊界可能就是未來(lái)微服務(wù)的邊界,不同限界上下文內(nèi)的領(lǐng)域邏輯被隔離在不同的微服務(wù)實(shí)例中運(yùn)行,物理上相互隔離,所以是物理邊界,邊界之間用實(shí)線來(lái)表示。 上面除了領(lǐng)域、聚合、實(shí)體外還出現(xiàn)了聚合根、值對(duì)象等詞語(yǔ), 除此之外還有統(tǒng)一建模語(yǔ)言、子域、核心域、通用域、支撐域等, 其實(shí)都是紙老虎, 前面說(shuō)過(guò)了為了方便對(duì)于某個(gè)領(lǐng)域的討論往往會(huì)形成一些概念,這些概念會(huì)有一些名詞概括, 上面的名詞就是這么來(lái)的, 這就叫統(tǒng)一建模語(yǔ)言 , 哈哈哈 ,好了,不扯淡, 我后面的文章會(huì)解釋下這些詞語(yǔ)的意思, 這兒主要討論DDD解決什么了問(wèn)題。 梳理一下DDD與微服務(wù)的關(guān)系, DDD 是一種架構(gòu)設(shè)計(jì)方法,微服務(wù)是一種架構(gòu)風(fēng)格,兩者從本質(zhì)上都是為了追求高響應(yīng)力,而從業(yè)務(wù)視角去分離應(yīng)用系統(tǒng)建設(shè)復(fù)雜度的手段。兩者都強(qiáng)調(diào)從業(yè)務(wù)出發(fā),其核心要義是強(qiáng)調(diào)根據(jù)業(yè)務(wù)發(fā)展,合理劃分領(lǐng)域邊界,持續(xù)調(diào)整現(xiàn)有架構(gòu),優(yōu)化現(xiàn)有代碼,以保持架構(gòu)
和代碼的生命力,也就是我們常說(shuō)的演進(jìn)式架構(gòu)。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)建和部署。