引言
? ? ? ? Cola作為當(dāng)前比較優(yōu)秀的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)最佳實(shí)踐框架越來越被更多的技術(shù)人所知曉。先拋出COLA 4.0:應(yīng)用架構(gòu)的最佳實(shí)踐_張建飛(Frank)的博客-CSDN博客_cola架構(gòu)?是關(guān)于COLA4.0最新的內(nèi)容介紹。然后個(gè)人對(duì)于讀了這篇文章后,對(duì)于其中的架構(gòu)理念和其中的各組件的設(shè)計(jì)加了一點(diǎn)個(gè)人解讀來分享。
? ? ? ? 主要分為兩部分來進(jìn)行分析,一個(gè)架構(gòu),一個(gè)組件。架構(gòu)主要想分析他的分層結(jié)構(gòu)對(duì)于我們做技術(shù)架構(gòu)設(shè)計(jì)和模塊劃分有的指導(dǎo)意義。組件主要就是對(duì)于一些編程的方法來解耦業(yè)務(wù)的最佳方法論。
COLA架構(gòu)解析
下圖轉(zhuǎn)載?COLA 4.0:應(yīng)用架構(gòu)的最佳實(shí)踐_張建飛(Frank)的博客-CSDN博客_cola架構(gòu)
?垂直拆分
? ? ? ? 從上往下分別有
- VO:ViewObject? 視圖 也就是給用戶看的數(shù)據(jù),也稱為Controller層
- DTO:? DomainTransferObject 領(lǐng)域轉(zhuǎn)化對(duì)象 也就是領(lǐng)域?qū)ο筠D(zhuǎn)換后的對(duì)象,也稱為Service層
- Entity:? Entity 實(shí)體? 也就是代表具體有行為的實(shí)際對(duì)象,也成為Domain層
- DO: DomainObject? 領(lǐng)域?qū)ο?,也就是領(lǐng)域?qū)ο螅A(chǔ)設(shè)施層
? ? ? ? 為什么會(huì)產(chǎn)生這樣的分層呢?我從最原始的時(shí)候開始說明,解說這個(gè)演變過程。
????????最早的時(shí)候還是單體服務(wù)時(shí)候,也沒有領(lǐng)域概念,有DAO層,實(shí)體層,服務(wù)(Service)層,控制(Controller)層,視圖(View)層。后來為了提升開發(fā)效率,展示層和邏輯徹底分離,就有了前后端分離的技術(shù),就弱化了視圖層。只有控制層,形成統(tǒng)一的MVC架構(gòu)。
? ? ? ? 后來業(yè)務(wù)發(fā)展越來越多樣化,視圖層對(duì)于數(shù)據(jù)結(jié)構(gòu)的需求越來越多,為了響應(yīng)這種變化,同時(shí)保持業(yè)務(wù)的擴(kuò)展性,就得在視圖層和實(shí)體層增加一層數(shù)據(jù)轉(zhuǎn)化層,用來應(yīng)對(duì)各種各樣的場(chǎng)景下的視圖,就形成了DAO層,實(shí)體層,DTO層,服務(wù)(Service)層,控制(Controller)層。
? ? ? ? 緊接著互聯(lián)網(wǎng)進(jìn)一步發(fā)展,業(yè)務(wù)進(jìn)一步擴(kuò)大,單體服務(wù)已經(jīng)不能滿足需求,就有了微服務(wù)。這時(shí)候服務(wù)的能力就進(jìn)而被拆分成多層,有聚合層和基礎(chǔ)服務(wù)層。此時(shí)分層服務(wù)層需求還可以滿足,但是聚合層的話就難以清晰的表達(dá)了。因?yàn)榫酆蠈涌赡軙?huì)涉及到多個(gè)也業(yè)務(wù)域,而不同的業(yè)務(wù)域?qū)τ诰酆蠈觼碇v又不能是實(shí)體層,也不能是服務(wù)層。因?yàn)槿绻麑?shí)體層,聚合服務(wù)內(nèi)的領(lǐng)域邊界就很難清晰。如果是服務(wù)層,那么聚合服務(wù)的本身的服務(wù)層就被污染了。所以很多微服務(wù)的框架引入了一個(gè)Model層,他直接在聚合層把不同業(yè)務(wù)域分在不同的Model里面。不過此方案對(duì)于開發(fā)工作者來說有較高的要求,需要他能很好的了解領(lǐng)域劃分。
? ? ? ? 后來就進(jìn)行了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),這個(gè)要滿足的就是以領(lǐng)域驅(qū)動(dòng),還有就是編程思想的轉(zhuǎn)變,以充血模型替代原來的貧血模型。他認(rèn)為對(duì)象除了有屬性職位還應(yīng)該有行為,有動(dòng)作,從而達(dá)到完整的對(duì)象的目的。屬性和行為密不可分的。所以將實(shí)體層和DAO層整合到一起形成基礎(chǔ)設(shè)施層。當(dāng)從基礎(chǔ)設(shè)施完成了對(duì)象的構(gòu)造之后就形成了領(lǐng)域?qū)?,就是領(lǐng)域?qū)ο?。?shí)體層同時(shí)也需要定義對(duì)象的實(shí)際行為,基本的增刪改查等等。DTO層保留,控制層和視圖層也保留。但是這個(gè)時(shí)候DTO雖然依然是進(jìn)行數(shù)據(jù)轉(zhuǎn)化,但是他是嚴(yán)格遵循業(yè)務(wù)過程中領(lǐng)域上下文(AddCustomerCmd)的數(shù)據(jù)轉(zhuǎn)化。
@Extension(bizId = Constants.BIZ_1)
public class CustomerBizOneConvertorExt implements CustomerConvertorExtPt {
@Autowired
private CustomerConvertor customerConvertor;//Composite basic convertor to do basic conversion
@Override
public CustomerEntity clientToEntity(AddCustomerCmd addCustomerCmd){
CustomerEntity customerEntity = customerConvertor.clientToEntity(addCustomerCmd);
CustomerDTO customerDTO =addCustomerCmd.getCustomerDTO();
//In this business, AD and RFQ are regarded as different source
if(Constants.SOURCE_AD.equals(customerDTO.getSource()))
{
customerEntity.setSourceType(SourceType.AD);
}
if (Constants.SOURCE_RFQ.equals(customerDTO.getSource())){
customerEntity.setSourceType(SourceType.RFQ);
}
return customerEntity;
}
}
此時(shí)的各個(gè)層之間的交互數(shù)據(jù)不再是對(duì)象或者其他,而只能是有領(lǐng)域邊界定義的限界上下文。領(lǐng)域的劃分和限界上下文的定義,請(qǐng)參考?猿創(chuàng)征文|微服務(wù)架構(gòu)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)_劍飛的編程思維的博客-CSDN博客_微服務(wù)拆分 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)
水平拆分
? ? ? ? 從左往右分別有
- VO:手機(jī)端,小程序端,瀏覽器端,消息,調(diào)度任務(wù)
- DTO:? 服務(wù),執(zhí)行器
- Entity:? 接口,模塊,能力
- DO: 接口實(shí)現(xiàn),倉(cāng)庫(kù),配置
? ? ? ? 水平拆分的目的是在于在同一個(gè)邏輯層次,由于應(yīng)用域不一樣,使用的方法差別比較大,比如手機(jī)端和小程序端返回的數(shù)據(jù)差別和功能迭代差別較大,所以需要拆分到不同的類別。再就是執(zhí)行器和服務(wù),服務(wù)完成了功能,但是有時(shí)候再執(zhí)行服務(wù)的時(shí)候可能會(huì)有相關(guān)聯(lián)的業(yè)務(wù)操作,這個(gè)時(shí)候需要用執(zhí)行器包裝,但是他要跟服務(wù)解耦,所以要拆分。防腐層,模塊和能力都是根據(jù)具體的業(yè)務(wù)做的一個(gè)劃分,主要是是根據(jù)職責(zé)劃分。踐行單一職責(zé)原則,迪米特法則。
COLA組件
? ? ? ? 組件解決是是我們?cè)偃粘i_發(fā)服務(wù)中經(jīng)常要用到的一些功能,封裝后我們可以直接復(fù)用。同時(shí)也是可以規(guī)范我們的開發(fā)能力,不會(huì)導(dǎo)致代碼風(fēng)格混亂,從而提升開發(fā)效率。
Catchlog組件
? ? ? ? 通過定義切面,對(duì)于請(qǐng)求處理前后,進(jìn)行日志打印,接口監(jiān)控。同時(shí)定義響應(yīng)體的統(tǒng)一處理接口,為統(tǒng)一處理提供一個(gè)可擴(kuò)展點(diǎn)
Domain組件
? ? ? ? 通過多例模式,實(shí)現(xiàn)了充血模型的開發(fā)。為什么要用多例?首先Spring的創(chuàng)建的Bean模式單例的,然后充血模型的實(shí)例中是有屬性的,那么他的行為只能在當(dāng)前線程中安全,如果是單例,那么線程不安全,所以必須要是多例模式。應(yīng)用了工廠模式生成多例。
DTO組件
? ? ? ? 定義數(shù)據(jù)轉(zhuǎn)換的基本結(jié)構(gòu),父類ClientObject,Command,Response,DTO等等,擴(kuò)展點(diǎn)名稱等統(tǒng)一定義父類,形成多態(tài),定義轉(zhuǎn)化數(shù)據(jù)的基本規(guī)范和職責(zé)
Exception組件
? ? ? ? 定義服務(wù)中的異常,系統(tǒng)異常,業(yè)務(wù)異常,檢查異常
Extention組件
? ? ? ? 擴(kuò)展點(diǎn)的定義以及組裝,通過函數(shù)接口,提取出擴(kuò)展點(diǎn),如圖
?函數(shù)接口,以及starter組裝,擴(kuò)展點(diǎn)的適配緩存都是較好的編程風(fēng)格
StateMachine組件
? ? ? ? 這個(gè)狀態(tài)機(jī)的核心思想就是把一些狀態(tài)流程,流程化的開發(fā)通過定義全局結(jié)構(gòu),實(shí)現(xiàn)邏輯和代碼的接口。核心的就是泛型的使用,狀態(tài)流轉(zhuǎn)的對(duì)象就是變更前,變更后,然后上下文主要對(duì)象。
????????除了以上的組件外,在開發(fā)中我們可能對(duì)于一些基本的操作都需要封裝成組件,以供開發(fā)規(guī)范使用。
總結(jié)
? ? ? ? 分析Cola除了我們可以在開發(fā)過程中去直接引用這個(gè)框架外,更重要的是我們可以改變我們的編程思維去學(xué)習(xí)這個(gè)思考過程,學(xué)習(xí)編程方法,應(yīng)用到我們實(shí)際的項(xiàng)目中,讓我們朝著更優(yōu)秀的程序員前進(jìn)。
????????文章來源地址http://www.zghlxwxcb.cn/news/detail-436993.html文章來源:http://www.zghlxwxcb.cn/news/detail-436993.html
????????
到了這里,關(guān)于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)實(shí)踐框架-COLA的解讀的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!