DDD实战课--学习笔记
目錄
學(xué)好了DDD,你能做什么?
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):微服務(wù)設(shè)計(jì)為什么要選擇DDD?
領(lǐng)域、子域、核心域、通用域和支撐域:傻傻分不清?
限界上下文:定義領(lǐng)域邊界的利器
實(shí)體和值對(duì)象:從領(lǐng)域模型的基礎(chǔ)單元看系統(tǒng)設(shè)計(jì)
聚合和聚合根:怎樣設(shè)計(jì)聚合?
領(lǐng)域事件:解耦微服務(wù)的關(guān)鍵
DDD分層架構(gòu):有效降低層與層之間的依賴
微服務(wù)架構(gòu)模型:幾種常見模型的對(duì)比和分析
中臺(tái):數(shù)字轉(zhuǎn)型后到底應(yīng)該共享什么?
DDD、中臺(tái)和微服務(wù):它們是如何協(xié)作的?
學(xué)好了DDD,你能做什么?
我認(rèn)為,要想應(yīng)用 DDD,首要任務(wù)就是要吃透 DDD 的核心設(shè)計(jì)思想,搞清楚 DDD、微服務(wù)和中臺(tái)之間的關(guān)系。中臺(tái)本質(zhì)是業(yè)務(wù)模型,微服務(wù)是業(yè)務(wù)模型的系統(tǒng)落地,DDD 是一種設(shè)計(jì)思想,它可以同時(shí)指導(dǎo)中臺(tái)業(yè)務(wù)建模和微服務(wù)設(shè)計(jì),它們之間就是這樣的一個(gè)鐵三角關(guān)系。DDD 強(qiáng)調(diào)領(lǐng)域模型和微服務(wù)設(shè)計(jì)的一體性,先有領(lǐng)域模型然后才有微服務(wù),而不是脫離領(lǐng)域模型來談微服務(wù)設(shè)計(jì)。
其次,就是通過戰(zhàn)略設(shè)計(jì),建立領(lǐng)域模型,劃分微服務(wù)邊界。
最后,通過戰(zhàn)術(shù)設(shè)計(jì),我們會(huì)從領(lǐng)域模型轉(zhuǎn)向微服務(wù)設(shè)計(jì)和落地。
DDD 的核心知識(shí)體系
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):微服務(wù)設(shè)計(jì)為什么要選擇DDD?
我認(rèn)為微服務(wù)拆分困境產(chǎn)生的根本原因就是不知道業(yè)務(wù)或者微服務(wù)的邊界到底在什么地方。換句話說,確定了業(yè)務(wù)邊界和應(yīng)用邊界,這個(gè)困境也就迎刃而解了。
DDD 是一種處理高度復(fù)雜領(lǐng)域的設(shè)計(jì)思想,它試圖分離技術(shù)實(shí)現(xiàn)的復(fù)雜性,并圍繞業(yè)務(wù)概念構(gòu)建領(lǐng)域模型來控制業(yè)務(wù)的復(fù)雜性,以解決軟件難以理解,難以演進(jìn)的問題。DDD 不是架構(gòu),而是一種架構(gòu)設(shè)計(jì)方法論,它通過邊界劃分將復(fù)雜業(yè)務(wù)領(lǐng)域簡(jiǎn)單化,幫我們?cè)O(shè)計(jì)出清晰的領(lǐng)域和應(yīng)用邊界,可以很容易地實(shí)現(xiàn)架構(gòu)演進(jìn)。
DDD 戰(zhàn)略設(shè)計(jì)會(huì)建立領(lǐng)域模型,領(lǐng)域模型可以用于指導(dǎo)微服務(wù)的設(shè)計(jì)和拆分。事件風(fēng)暴是建立領(lǐng)域模型的主要方法,它是一個(gè)從發(fā)散到收斂的過程。它通常采用用例分析、場(chǎng)景分析和用戶旅程分析,盡可能全面不遺漏地分解業(yè)務(wù)領(lǐng)域,并梳理領(lǐng)域?qū)ο笾g的關(guān)系,這是一個(gè)發(fā)散的過程。事件風(fēng)暴過程會(huì)產(chǎn)生很多的實(shí)體、命令、事件等領(lǐng)域?qū)ο?#xff0c;我們將這些領(lǐng)域?qū)ο髲牟煌木S度進(jìn)行聚類,形成如聚合、限界上下文等邊界,建立領(lǐng)域模型,這就是一個(gè)收斂的過程。
在從業(yè)務(wù)模型向微服務(wù)落地的過程中,也就是從戰(zhàn)略設(shè)計(jì)向戰(zhàn)術(shù)設(shè)計(jì)的實(shí)施過程中,我們會(huì)將領(lǐng)域模型中的領(lǐng)域?qū)ο笈c代碼模型中的代碼對(duì)象建立映射關(guān)系,將業(yè)務(wù)架構(gòu)和系統(tǒng)架構(gòu)進(jìn)行綁定。當(dāng)我們?nèi)ロ憫?yīng)業(yè)務(wù)變化調(diào)整業(yè)務(wù)架構(gòu)和領(lǐng)域模型時(shí),系統(tǒng)架構(gòu)也會(huì)同時(shí)發(fā)生調(diào)整,并同步建立新的映射關(guā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)和代碼的生命力,也就是我們常說的演進(jìn)式架構(gòu)。
DDD 主要關(guān)注:從業(yè)務(wù)領(lǐng)域視角劃分領(lǐng)域邊界,構(gòu)建通用語言進(jìn)行高效溝通,通過業(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ú)立開發(fā)、測(cè)試、構(gòu)建和部署。
領(lǐng)域、子域、核心域、通用域和支撐域:傻傻分不清?
DDD 的領(lǐng)域就是這個(gè)邊界內(nèi)要解決的業(yè)務(wù)問題域。
領(lǐng)域可以進(jìn)一步劃分為子領(lǐng)域。我們把劃分出來的多個(gè)子領(lǐng)域稱為子域,每個(gè)子域?qū)?yīng)一個(gè)更小的問題域或更小的業(yè)務(wù)范圍。
子域可以根據(jù)自身重要性和功能屬性劃分為三類子域,它們分別是:核心域、通用域和支撐域。
決定產(chǎn)品和公司核心競(jìng)爭(zhēng)力的子域是核心域,它是業(yè)務(wù)成功的主要因素和公司的核心競(jìng)爭(zhēng)力。沒有太多個(gè)性化的訴求,同時(shí)被多個(gè)子域使用的通用功能子域是通用域。還有一種功能子域是必需的,但既不包含決定產(chǎn)品和公司核心競(jìng)爭(zhēng)力的功能,也不包含通用功能的子域,它就是支撐域。
核心域、支撐域和通用域的主要目標(biāo)是:通過領(lǐng)域劃分,區(qū)分不同子域在公司內(nèi)的不同功能屬性和重要性,從而公司可對(duì)不同子域采取不同的資源投入和建設(shè)策略,其關(guān)注度也會(huì)不一樣。
限界上下文:定義領(lǐng)域邊界的利器
在 DDD 領(lǐng)域建模和系統(tǒng)建設(shè)過程中,有很多的參與者,包括領(lǐng)域?qū)<摇a(chǎn)品經(jīng)理、項(xiàng)目經(jīng)理、架構(gòu)師、開發(fā)經(jīng)理和測(cè)試經(jīng)理等。對(duì)同樣的領(lǐng)域知識(shí),不同的參與角色可能會(huì)有不同的理解,那大家交流起來就會(huì)有障礙,怎么辦呢?因此,在 DDD 中就出現(xiàn)了“通用語言”和“限界上下文”這兩個(gè)重要的概念。
通用語言定義上下文含義,限界上下文則定義領(lǐng)域邊界,以確保每個(gè)上下文含義在它特定的邊界內(nèi)都具有唯一的含義,領(lǐng)域模型則存在于這個(gè)邊界之內(nèi)。
在事件風(fēng)暴過程中,通過團(tuán)隊(duì)交流達(dá)成共識(shí)的,能夠簡(jiǎn)單、清晰、準(zhǔn)確描述業(yè)務(wù)涵義和規(guī)則的語言就是通用語言。
為了避免同樣的概念或語義在不同的上下文環(huán)境中產(chǎn)生歧義,DDD 在戰(zhàn)略設(shè)計(jì)上提出了“限界上下文”這個(gè)概念,用來確定語義所在的領(lǐng)域邊界。
我認(rèn)為限界上下文的定義就是:用來封裝通用語言和領(lǐng)域?qū)ο?#xff0c;提供上下文環(huán)境,保證在領(lǐng)域之內(nèi)的一些術(shù)語、業(yè)務(wù)相關(guān)對(duì)象等(通用語言)有一個(gè)確切的含義,沒有二義性。這個(gè)邊界定義了模型的適用范圍,使團(tuán)隊(duì)所有成員能夠明確地知道什么應(yīng)該在模型中實(shí)現(xiàn),什么不應(yīng)該在模型中實(shí)現(xiàn)。
實(shí)體和值對(duì)象:從領(lǐng)域模型的基礎(chǔ)單元看系統(tǒng)設(shè)計(jì)
在 DDD 中有這樣一類對(duì)象,它們擁有唯一標(biāo)識(shí)符,且標(biāo)識(shí)符在歷經(jīng)各種狀態(tài)變更后仍能保持一致。對(duì)這些對(duì)象而言,重要的不是其屬性,而是其延續(xù)性和標(biāo)識(shí),對(duì)象的延續(xù)性和標(biāo)識(shí)會(huì)跨越甚至超出軟件的生命周期。我們把這樣的對(duì)象稱為實(shí)體。
通過對(duì)象屬性值來識(shí)別的對(duì)象,它將多個(gè)相關(guān)屬性組合為一個(gè)概念整體。在 DDD 中用來描述領(lǐng)域的特定方面,并且是一個(gè)沒有標(biāo)識(shí)符的對(duì)象,叫作值對(duì)象。
人員實(shí)體原本包括:姓名、年齡、性別以及人員所在的省、市、縣和街道等屬性。這樣顯示地址相關(guān)的屬性就很零碎了對(duì)不對(duì)?現(xiàn)在,我們可以將“省、市、縣和街道等屬性”拿出來構(gòu)成一個(gè)“地址屬性集合”,這個(gè)集合就是值對(duì)象了。
同樣的對(duì)象在不同的場(chǎng)景下,可能會(huì)設(shè)計(jì)出不同的結(jié)果。有些場(chǎng)景中,地址會(huì)被某一實(shí)體引用,它只承擔(dān)描述實(shí)體的作用,并且它的值只能整體替換,這時(shí)候你就可以將地址設(shè)計(jì)為值對(duì)象,比如收貨地址。而在某些業(yè)務(wù)場(chǎng)景中,地址會(huì)被經(jīng)常修改,地址是作為一個(gè)獨(dú)立對(duì)象存在的,這時(shí)候它應(yīng)該設(shè)計(jì)為實(shí)體,比如行政區(qū)劃中的地址信息維護(hù)。
聚合和聚合根:怎樣設(shè)計(jì)聚合?
領(lǐng)域模型內(nèi)的實(shí)體和值對(duì)象就好比個(gè)體,而能讓實(shí)體和值對(duì)象協(xié)同工作的組織就是聚合,它用來確保這些領(lǐng)域?qū)ο笤趯?shí)現(xiàn)共同的業(yè)務(wù)邏輯時(shí),能保證數(shù)據(jù)的一致性。
聚合就是由業(yè)務(wù)和邏輯緊密關(guān)聯(lián)的實(shí)體和值對(duì)象組合而成的,聚合是數(shù)據(jù)修改和持久化的基本單元,每一個(gè)聚合對(duì)應(yīng)一個(gè)倉儲(chǔ),實(shí)現(xiàn)數(shù)據(jù)的持久化。
聚合根的主要目的是為了避免由于復(fù)雜數(shù)據(jù)模型缺少統(tǒng)一的業(yè)務(wù)規(guī)則控制,而導(dǎo)致聚合、實(shí)體之間數(shù)據(jù)不一致性的問題。
如果把聚合比作組織,那聚合根就是這個(gè)組織的負(fù)責(zé)人。聚合根也稱為根實(shí)體,它不僅是實(shí)體,還是聚合的管理者。
DDD 領(lǐng)域建模通常采用事件風(fēng)暴,它通常采用用例分析、場(chǎng)景分析和用戶旅程分析等方法,通過頭腦風(fēng)暴列出所有可能的業(yè)務(wù)行為和事件,然后找出產(chǎn)生這些行為的領(lǐng)域?qū)ο?#xff0c;并梳理領(lǐng)域?qū)ο笾g的關(guān)系,找出聚合根,找出與聚合根業(yè)務(wù)緊密關(guān)聯(lián)的實(shí)體和值對(duì)象,再將聚合根、實(shí)體和值對(duì)象組合,構(gòu)建聚合。
領(lǐng)域事件:解耦微服務(wù)的關(guān)鍵
在事件風(fēng)暴(Event Storming)時(shí),我們發(fā)現(xiàn)除了命令和操作等業(yè)務(wù)行為以外,還有一種非常重要的事件,這種事件發(fā)生后通常會(huì)導(dǎo)致進(jìn)一步的業(yè)務(wù)操作,在 DDD 中這種事件被稱為領(lǐng)域事件。
舉例來說的話,領(lǐng)域事件可以是業(yè)務(wù)流程的一個(gè)步驟,比如投保業(yè)務(wù)繳費(fèi)完成后,觸發(fā)投保單轉(zhuǎn)保單的動(dòng)作;也可能是定時(shí)批處理過程中發(fā)生的事件,比如批處理生成季繳保費(fèi)通知單,觸發(fā)發(fā)送繳費(fèi)郵件通知操作;或者一個(gè)事件發(fā)生后觸發(fā)的后續(xù)動(dòng)作,比如密碼連續(xù)輸錯(cuò)三次,觸發(fā)鎖定賬戶的動(dòng)作。
通過領(lǐng)域事件驅(qū)動(dòng)的異步化機(jī)制,可以推動(dòng)業(yè)務(wù)流程和數(shù)據(jù)在各個(gè)不同微服務(wù)之間的流轉(zhuǎn),實(shí)現(xiàn)微服務(wù)的解耦,減輕微服務(wù)之間服務(wù)調(diào)用的壓力,提升用戶體驗(yàn)。
領(lǐng)域事件處理包括:事件構(gòu)建和發(fā)布、事件數(shù)據(jù)持久化、事件總線、消息中間件、事件接收和處理等。
DDD分層架構(gòu):有效降低層與層之間的依賴
DDD 分層架構(gòu)
DDD 分層架構(gòu)有一個(gè)重要的原則:每層只能與位于其下方的層發(fā)生耦合。
微服務(wù)架構(gòu)的演進(jìn)
微服務(wù)內(nèi)服務(wù)的演進(jìn)
三層架構(gòu)向 DDD 分層架構(gòu)演進(jìn)
DDD 分層架構(gòu)包含用戶接口層、應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)層。通過這些層次劃分,我們可以明確微服務(wù)各層的職能,劃定各領(lǐng)域?qū)ο蟮倪吔?#xff0c;確定各領(lǐng)域?qū)ο蟮膮f(xié)作方式。這種架構(gòu)既體現(xiàn)了微服務(wù)設(shè)計(jì)和架構(gòu)演進(jìn)的需求,又很好地融入了領(lǐng)域模型的概念,二者無縫結(jié)合,相信會(huì)給你的微服務(wù)設(shè)計(jì)帶來不一樣的感覺。
微服務(wù)架構(gòu)模型:幾種常見模型的對(duì)比和分析
整潔架構(gòu)
整潔架構(gòu)最主要的原則是依賴原則,它定義了各層的依賴關(guān)系,越往里依賴越低,代碼級(jí)別越高,越是核心能力。外圓代碼依賴只能指向內(nèi)圓,內(nèi)圓不需要知道外圓的任何情況。
六邊形架構(gòu)
六邊形架構(gòu)的核心理念是:應(yīng)用是通過端口與外部進(jìn)行交互的。
紅圈內(nèi)的核心業(yè)務(wù)邏輯(應(yīng)用程序和領(lǐng)域模型)與外部資源(包括 APP、Web 應(yīng)用以及數(shù)據(jù)庫資源等)完全隔離,僅通過適配器進(jìn)行交互。它解決了業(yè)務(wù)邏輯與用戶界面的代碼交錯(cuò)問題,很好地實(shí)現(xiàn)了前后端分離。六邊形架構(gòu)各層的依賴關(guān)系與整潔架構(gòu)一樣,都是由外向內(nèi)依賴。
三種微服務(wù)架構(gòu)模型的對(duì)比和分析
這三種架構(gòu)模型的設(shè)計(jì)思想正是微服務(wù)架構(gòu)高內(nèi)聚低耦合原則的完美體現(xiàn),而它們身上閃耀的正是以領(lǐng)域模型為中心的設(shè)計(jì)思想。
架構(gòu)模型通過分層的方式來控制需求變化從外到里對(duì)系統(tǒng)的影響,從外向里受需求影響逐步減小。面向用戶的前端可以快速響應(yīng)外部需求進(jìn)行調(diào)整和發(fā)布,靈活多變,應(yīng)用層通過服務(wù)組合和編排來實(shí)現(xiàn)業(yè)務(wù)流程的快速適配上線,減少傳導(dǎo)到領(lǐng)域?qū)拥男枨?#xff0c;使領(lǐng)域?qū)颖3珠L(zhǎng)期穩(wěn)定。
項(xiàng)目級(jí)微服務(wù)
項(xiàng)目級(jí)微服務(wù)的內(nèi)部遵循分層架構(gòu)模型就可以了。領(lǐng)域模型的核心邏輯在領(lǐng)域?qū)訉?shí)現(xiàn),服務(wù)的組合和編排在應(yīng)用層實(shí)現(xiàn),通過 API 網(wǎng)關(guān)為前臺(tái)應(yīng)用提供服務(wù),實(shí)現(xiàn)前后端分離。但項(xiàng)目級(jí)的微服務(wù)可能會(huì)調(diào)用其它微服務(wù),你看在下面這張圖中,比如某個(gè)項(xiàng)目級(jí)微服務(wù) B 調(diào)用認(rèn)證微服務(wù) A,完成登錄和權(quán)限認(rèn)證。
企業(yè)級(jí)中臺(tái)微服務(wù)
我們可以在中臺(tái)微服務(wù)之上增加一層,你看下面這張圖,增加的這一層就位于紅色框內(nèi),它的主要職能就是處理跨中臺(tái)微服務(wù)的服務(wù)組合和編排,以及微服務(wù)之間的協(xié)調(diào),它還可以完成前端不同渠道應(yīng)用的適配。如果再將它的業(yè)務(wù)范圍擴(kuò)大一些,我可以將它做成一個(gè)面向不同行業(yè)和渠道的服務(wù)平臺(tái)。
在微服務(wù)架構(gòu)中,應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)層解耦是通過倉儲(chǔ)模式,采用依賴倒置的設(shè)計(jì)方法來實(shí)現(xiàn)的。在應(yīng)用設(shè)計(jì)中,我們會(huì)同步考慮和基礎(chǔ)資源的代碼適配,那么一旦基礎(chǔ)設(shè)施資源出現(xiàn)變更(比如換數(shù)據(jù)庫),就可以屏蔽資源變更對(duì)業(yè)務(wù)代碼的影響,切斷業(yè)務(wù)邏輯對(duì)基礎(chǔ)資源的依賴,最終降低資源變更對(duì)應(yīng)用的影響。
DDD 分層架構(gòu)、整潔架構(gòu)、六邊形架構(gòu)都是以領(lǐng)域模型為核心,實(shí)行分層架構(gòu),內(nèi)部核心業(yè)務(wù)邏輯與外部應(yīng)用、資源隔離并解耦。
中臺(tái):數(shù)字轉(zhuǎn)型后到底應(yīng)該共享什么?
中臺(tái)的關(guān)鍵詞:共享、聯(lián)通、融合和創(chuàng)新。聯(lián)通是前臺(tái)以及中臺(tái)之間的聯(lián)通,融合是前臺(tái)流程和數(shù)據(jù)的融合,并以共享的方式支持前端一線業(yè)務(wù)的發(fā)展和創(chuàng)新。
我認(rèn)為,中臺(tái)首先體現(xiàn)的是一種企業(yè)級(jí)的能力,它提供的是一套企業(yè)級(jí)的整體解決方案,解決小到企業(yè)、集團(tuán),大到生態(tài)圈的能力共享、聯(lián)通和融合問題,支持業(yè)務(wù)和商業(yè)模式創(chuàng)新。通過平臺(tái)聯(lián)通和數(shù)據(jù)融合為用戶提供一致的體驗(yàn),更敏捷地支撐前臺(tái)一線業(yè)務(wù)。
數(shù)字化轉(zhuǎn)型中臺(tái)應(yīng)該共享什么
在中臺(tái)設(shè)計(jì)和規(guī)劃時(shí),我們需要整體考慮企業(yè)內(nèi)前臺(tái)、中臺(tái)以及后臺(tái)應(yīng)用的協(xié)同,實(shí)現(xiàn)不同渠道應(yīng)用的前端頁面、流程和服務(wù)的共享,還有核心業(yè)務(wù)鏈路的聯(lián)通以及前臺(tái)流程和數(shù)據(jù)的融合、共享,支持業(yè)務(wù)和商業(yè)模式的創(chuàng)新。
如何實(shí)現(xiàn)前中后臺(tái)的協(xié)同?
如果把業(yè)務(wù)中臺(tái)比作陸軍、火箭軍和空軍等專業(yè)軍種的話,它主要發(fā)揮戰(zhàn)術(shù)專業(yè)能力。前臺(tái)就是作戰(zhàn)部隊(duì),它需要根據(jù)前線的戰(zhàn)場(chǎng)需求,對(duì)業(yè)務(wù)中臺(tái)的能力進(jìn)行調(diào)度,實(shí)現(xiàn)能力融合和效率最大化。而數(shù)據(jù)中臺(tái)就是信息情報(bào)中心和聯(lián)合作戰(zhàn)總指揮部,它能夠匯集各種數(shù)據(jù)、完成分析,制定戰(zhàn)略和戰(zhàn)術(shù)計(jì)劃。后臺(tái)就是后勤部隊(duì),提供技術(shù)支持。
前臺(tái)主要面向客戶以及終端銷售者,實(shí)現(xiàn)營(yíng)銷推廣以及交易轉(zhuǎn)化;中臺(tái)主要面向運(yùn)營(yíng)人員,完成運(yùn)營(yíng)支撐;后臺(tái)主要面向后臺(tái)管理人員,實(shí)現(xiàn)流程審核、內(nèi)部管理以及后勤支撐,比如采購、人力、財(cái)務(wù)和 OA 等系統(tǒng)。
前臺(tái)通過頁面和流程共享實(shí)現(xiàn)不同渠道應(yīng)用之間的前臺(tái)融合,中臺(tái)通過 API 實(shí)現(xiàn)服務(wù)共享。而前臺(tái)、業(yè)務(wù)中臺(tái)和數(shù)據(jù)中臺(tái)的融合可以實(shí)現(xiàn)傳統(tǒng)應(yīng)用與互聯(lián)網(wǎng)應(yīng)用的融合,從而解決“后端雙核心、前端兩張皮”的問題。能力復(fù)用了,前臺(tái)流程和數(shù)據(jù)融合了,才能更好地支持業(yè)務(wù)的融合和商業(yè)模式的創(chuàng)新。
DDD、中臺(tái)和微服務(wù):它們是如何協(xié)作的?
中臺(tái)是抽象出來的業(yè)務(wù)模型,微服務(wù)是業(yè)務(wù)模型的系統(tǒng)實(shí)現(xiàn),DDD 作為方法論可以同時(shí)指導(dǎo)中臺(tái)業(yè)務(wù)建模和微服務(wù)建設(shè),三者相輔相成,完美結(jié)合。
中臺(tái)在企業(yè)架構(gòu)上更多偏向業(yè)務(wù)模型,形成中臺(tái)的過程實(shí)際上也是業(yè)務(wù)領(lǐng)域不斷細(xì)分的過程。在這個(gè)過程中我們會(huì)將同類通用的業(yè)務(wù)能力進(jìn)行聚合和業(yè)務(wù)重構(gòu),再根據(jù)限界上下文和業(yè)務(wù)內(nèi)聚的原則建立領(lǐng)域模型。而 DDD 的戰(zhàn)略設(shè)計(jì)最擅長(zhǎng)的就是領(lǐng)域建模。
那在中臺(tái)完成領(lǐng)域建模后,我們就需要通過微服務(wù)來完成系統(tǒng)建設(shè)。此時(shí),DDD 的戰(zhàn)術(shù)設(shè)計(jì)又恰好可以與微服務(wù)的設(shè)計(jì)完美結(jié)合。可以說,中臺(tái)和微服務(wù)正是 DDD 實(shí)戰(zhàn)的最佳場(chǎng)景。
DDD、中臺(tái)和微服務(wù)的協(xié)作模式
如果將企業(yè)內(nèi)整個(gè)業(yè)務(wù)域作為一個(gè)問題域的話,企業(yè)內(nèi)的所有業(yè)務(wù)就是一個(gè)領(lǐng)域。在進(jìn)行領(lǐng)域細(xì)分時(shí),從 DDD 視角來看,子域可分為核心域、通用域和支撐域。從中臺(tái)建設(shè)的視角來看,業(yè)務(wù)域細(xì)分后的業(yè)務(wù)中臺(tái),可分為核心中臺(tái)和通用中臺(tái)。
從領(lǐng)域功能屬性和重要性對(duì)照來看,通用中臺(tái)對(duì)應(yīng) DDD 的通用域和支撐域,核心中臺(tái)對(duì)應(yīng) DDD 的核心域。從領(lǐng)域的功能范圍來看,子域與中臺(tái)是一致的。領(lǐng)域模型所在的限界上下文對(duì)應(yīng)微服務(wù)。建立了這個(gè)映射關(guān)系,我們就可以用 DDD 來進(jìn)行中臺(tái)業(yè)務(wù)建模了。
中臺(tái)如何建模?
中臺(tái)業(yè)務(wù)抽象的過程就是業(yè)務(wù)建模的過程,對(duì)應(yīng) DDD 的戰(zhàn)略設(shè)計(jì)。系統(tǒng)抽象的過程就是微服務(wù)的建設(shè)過程,對(duì)應(yīng) DDD 的戰(zhàn)術(shù)設(shè)計(jì)。
DDD 戰(zhàn)略設(shè)計(jì)包括上述的第一步到第四步,主要為:業(yè)務(wù)域分解為中臺(tái),對(duì)中臺(tái)歸類,完成領(lǐng)域建模,建立中臺(tái)業(yè)務(wù)模型。DDD 戰(zhàn)術(shù)設(shè)計(jì)是第五步,領(lǐng)域模型映射為微服務(wù),完成中臺(tái)建設(shè)。
歡迎各位讀者加入微信群一起學(xué)習(xí)交流,
在公眾號(hào)后臺(tái)回復(fù)“加群”即可~~
總結(jié)
以上是生活随笔為你收集整理的DDD实战课--学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeetleX.Http.Clients
- 下一篇: 《进击吧!Blazor!》系列入门教程