南寧中小企業(yè)網(wǎng)站制作許昌seo公司
目錄
1、概述
2、整潔架構(gòu)
3、六邊形架構(gòu)
4、三種微服務(wù)架構(gòu)模型的對(duì)比和分析
5、從三種架構(gòu)模型看中臺(tái)和微服務(wù)設(shè)計(jì)
5.1 中臺(tái)建設(shè)要聚焦領(lǐng)域模型
5.2 微服務(wù)要有合理的架構(gòu)分層
5.2.1 項(xiàng)目級(jí)微服務(wù)
5.2.2 企業(yè)級(jí)中臺(tái)微服務(wù)
5.3 應(yīng)用和資源的解耦與適配
6、總結(jié)
1、概述
DDD分層架構(gòu)、整潔架構(gòu)、六邊形架構(gòu)這三種架構(gòu)模型放到一起,對(duì)比分析,看看如何利用好它
們,幫助我們?cè)O(shè)計(jì)出高內(nèi)聚低耦合的中臺(tái)以及微服務(wù)架構(gòu)。
2、整潔架構(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)容,比如用戶(hù)界面和基礎(chǔ)設(shè)施。
整潔架構(gòu)最主要的原則是依賴(lài)原則,它定義了各層的依賴(lài)關(guān)系,越往里依賴(lài)越低,代碼級(jí)別越高,
越是核心能力。
外圓代碼依賴(lài)只能指向內(nèi)圓,內(nèi)圓不需要知道外圓的任何情況。
領(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)和方法集合。
應(yīng)用服務(wù)實(shí)現(xiàn)與用戶(hù)操作相關(guān)的服務(wù)組合與編排,它包含了應(yīng)用特有的業(yè)務(wù)流程規(guī)則,封裝和實(shí)現(xiàn)
了系統(tǒng)所有用例。
最外層主要提供適配的能力,適配能力分為主動(dòng)適配和被動(dòng)適配。主動(dòng)適配主要實(shí)現(xiàn)外部用戶(hù)、網(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ù)能力。
3、六邊形架構(gòu)
六邊形架構(gòu)又名“端口適配器架構(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ù)邏
輯與用戶(hù)界面的代碼交錯(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)。
六邊形架構(gòu)的一個(gè)端口可能對(duì)應(yīng)多個(gè)外部系統(tǒng),不同的外部系統(tǒng)也可能會(huì)使用不同的適配器,由適
配器負(fù)責(zé)協(xié)議轉(zhuǎn)換。這就使得應(yīng)用程序能夠以一致的方式被用戶(hù)、程序、自動(dòng)化測(cè)試和批處理腳本
使用。
4、三種微服務(wù)架構(gòu)模型的對(duì)比和分析
這三種架構(gòu)模型的設(shè)計(jì)思想正是微服務(wù)架構(gòu)高內(nèi)聚低耦合原則的完美體現(xiàn),而它們身上閃耀的正是
以領(lǐng)域模型為中心的設(shè)計(jì)思想。
按照這種功能的差異,我們?cè)谶@三種架構(gòu)中劃分了應(yīng)用層和領(lǐng)域?qū)?/strong>,來(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)面向用戶(hù)操作相關(guān)的用例和流程,對(duì)外提供粗粒度的API服務(wù)。
可以說(shuō),這三種架構(gòu)都考慮了前端需求的變與領(lǐng)域模型的不變。
總體來(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)的影響,從外向里受需求影響逐步減小。
這樣設(shè)計(jì)的好處很明顯了,就是可以保證領(lǐng)域?qū)拥暮诵臉I(yè)務(wù)邏輯不會(huì)因?yàn)橥獠啃枨蠛土鞒痰淖儎?dòng)而
調(diào)整,對(duì)于建立前臺(tái)靈活、中臺(tái)穩(wěn)固的架構(gòu)很有幫助。
中臺(tái)和微服務(wù)設(shè)計(jì)的關(guān)鍵:領(lǐng)域模型和微服務(wù)的合理分層設(shè)計(jì)。
5、從三種架構(gòu)模型看中臺(tái)和微服務(wù)設(shè)計(jì)
中臺(tái)本質(zhì)上是領(lǐng)域的子域,它可能是核心域,也可能是通用域或支撐域。通常大家認(rèn)為阿里的中臺(tái)
對(duì)應(yīng)DDD的通用域,將通用的公共能力沉淀為中臺(tái),對(duì)外提供通用共享服務(wù)。
中臺(tái)作為子域還可以繼續(xù)分解為子子域,在子域分解到合適大小,通過(guò)事件風(fēng)暴劃分限界上下文以
后,就可以定義微服務(wù)了,微服務(wù)用來(lái)實(shí)現(xiàn)中臺(tái)的能力。表面上看,DDD、中臺(tái)、微服務(wù)這三者
之間似乎沒(méi)什么關(guān)聯(lián),實(shí)際上它們的關(guān)系是非常緊密的,組合在一起可以作為一個(gè)理論體系用于你
的中臺(tái)和微服務(wù)設(shè)計(jì)。
5.1 中臺(tái)建設(shè)要聚焦領(lǐng)域模型
中臺(tái)需要站在全企業(yè)的高度,考慮能力的共享和復(fù)用。
中臺(tái)設(shè)計(jì)時(shí),我們需要建立中臺(tái)內(nèi)所有限界上下文的領(lǐng)域模型,DDD 建模過(guò)程中會(huì)考慮架構(gòu)演進(jìn)
和功能的重新組合。領(lǐng)域模型建立的過(guò)程會(huì)對(duì)業(yè)務(wù)和應(yīng)用進(jìn)行清晰的邏輯和物理邊界(微服務(wù))劃
分。領(lǐng)域模型的結(jié)果會(huì)影響到后續(xù)的系統(tǒng)模型、架構(gòu)模型和代碼模型,最終影響到微服務(wù)的拆分和
項(xiàng)目落地。
因此,在中臺(tái)設(shè)計(jì)中我們首先要聚焦領(lǐng)域模型,將它放在核心位置。
5.2 微服務(wù)要有合理的架構(gòu)分層
微服務(wù)設(shè)計(jì)要有分層的設(shè)計(jì)思想,讓各層各司其職,建立松耦合的層間關(guān)系。
不要把與領(lǐng)域無(wú)關(guān)的邏輯放在領(lǐng)域?qū)訉?shí)現(xiàn),保證領(lǐng)域?qū)拥募儩嵑皖I(lǐng)域邏輯的穩(wěn)定,避免污染領(lǐng)域模
型。也不要把領(lǐng)域模型的業(yè)務(wù)邏輯放在應(yīng)用層,這樣會(huì)導(dǎo)致應(yīng)用層過(guò)于龐大,最終領(lǐng)域模型會(huì)失
焦。如果實(shí)在無(wú)法避免,我們可以
引入防腐層,進(jìn)行新老系統(tǒng)的適配和轉(zhuǎn)換,過(guò)渡期完成后,可以直接將防腐層代碼拋棄。
有的微服務(wù)可以與前端應(yīng)用集成,一起完成特定的業(yè)務(wù),這是項(xiàng)目級(jí)微服務(wù)。而有的則是某個(gè)職責(zé)
單一的中臺(tái)微服務(wù),企業(yè)級(jí)的業(yè)務(wù)流程需要將多個(gè)這樣的微服務(wù)組合起來(lái)才能完成,這是企業(yè)級(jí)中
臺(tái)微服務(wù)。兩類(lèi)微服務(wù)由于復(fù)雜度不一樣,集成方式也會(huì)有差異。
5.2.1 項(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),通過(guò)API網(wǎng)關(guān)為前臺(tái)應(yīng)用提
供服務(wù),實(shí)現(xiàn)前后端分離。但項(xiàng)目級(jí)的微服務(wù),可能會(huì)調(diào)用其它微服務(wù)。通常項(xiàng)目級(jí)微服務(wù)之間的
集成,發(fā)生在微服務(wù)的應(yīng)用層,由應(yīng)用服務(wù)調(diào)用其它微服務(wù)發(fā)布在API網(wǎng)關(guān)上的應(yīng)用服務(wù)。
它除了可以組合和編排自己的領(lǐng)域服務(wù)外,還可以組合和編排外部微服務(wù)的應(yīng)用服務(wù)。它只要將編
排后的服務(wù)發(fā)布到API網(wǎng)關(guān)供前端調(diào)用,這樣前端就可以直接訪問(wèn)自己的微服務(wù)了。
5.2.2 企業(yè)級(jí)中臺(tái)微服務(wù)
企業(yè)級(jí)的業(yè)務(wù)流程,往往是多個(gè)中臺(tái)微服務(wù)一起協(xié)作完成的。
企業(yè)級(jí)中臺(tái)微服務(wù)的集成不能像項(xiàng)目級(jí)微服務(wù)一樣,在某一個(gè)微服務(wù)內(nèi)完成跨微服務(wù)的服務(wù)組合和
編排。
我們可以在中臺(tái)微服務(wù)之上增加一層,增加的這一層它的主要職能就是處理跨中臺(tái)微服務(wù)的服務(wù)組
合和編排,以及微服務(wù)之間的協(xié)調(diào),它還可以完成前端不同渠道應(yīng)用的適配。如果再將它的業(yè)務(wù)范
圍擴(kuò)大一些,我可以將它做成一個(gè)面向不同行業(yè)和渠道的服務(wù)平臺(tái)。
我們借用BFF(服務(wù)于前端的后端,Backend for Frontends)這個(gè)詞,暫且稱(chēng)它為BFF 微服務(wù)。
BFF微服務(wù)與其它微服務(wù)存在較大的差異,就是它沒(méi)有領(lǐng)域模型,因此這個(gè)微服務(wù)內(nèi)也不會(huì)有領(lǐng)域
層。BFF微服務(wù)可以承擔(dān)應(yīng)用層和用戶(hù)接口層的主要職能,完成各個(gè)中臺(tái)微服務(wù)的服務(wù)組合和編
排,可以適配不同前端和渠道的要求。
5.3 應(yīng)用和資源的解耦與適配
傳統(tǒng)以數(shù)據(jù)為中心的設(shè)計(jì)模式,應(yīng)用會(huì)對(duì)數(shù)據(jù)庫(kù)、緩存、文件系統(tǒng)等基礎(chǔ)資源產(chǎn)生嚴(yán)重依賴(lài)。
正是由于它們之間的這種強(qiáng)依賴(lài)的關(guān)系,我們一旦更換基礎(chǔ)資源就會(huì)對(duì)應(yīng)用產(chǎn)生很大的影響,因此
需要為應(yīng)用和資源解耦。
在微服務(wù)架構(gòu)中,應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)層解耦是通過(guò)倉(cāng)儲(chǔ)模式,采用依賴(lài)倒置的設(shè)計(jì)方法來(lái)實(shí)現(xiàn)
的。在應(yīng)用設(shè)計(jì)中,我們會(huì)同步考慮和基礎(chǔ)資源的代碼適配,那么一旦基礎(chǔ)設(shè)施資源出現(xiàn)變更(比
如換數(shù)據(jù)庫(kù)),就可以屏蔽資源變更對(duì)業(yè)務(wù)代碼的影響,切斷業(yè)務(wù)邏輯對(duì)基礎(chǔ)資源的依賴(lài),最終降
低資源變更對(duì)應(yīng)用的影響。
6、總結(jié)
DDD分層架構(gòu)、整潔架構(gòu)、六邊形架構(gòu)都是以領(lǐng)域模型為核心,實(shí)行分層架構(gòu),內(nèi)部核心業(yè)務(wù)邏
輯與外部應(yīng)用、資源隔離并解耦。請(qǐng)務(wù)必記好這個(gè)設(shè)計(jì)思想,今后會(huì)有大用處。