COLA分層架構(gòu)
COLA 4.0 架構(gòu)分成COLA架構(gòu)和COLA組件兩個(gè)部分:
- COLA架構(gòu):關(guān)注應(yīng)用架構(gòu)的定義和構(gòu)建辞色,提升應(yīng)用質(zhì)量新蟆。
- COLA組件:提供應(yīng)用開(kāi)發(fā)所需要的可復(fù)用組件,提升研發(fā)效率锅知。
COLA架構(gòu):關(guān)注應(yīng)用架構(gòu)的定義和構(gòu)建妇拯,提升應(yīng)用質(zhì)量幻馁。領(lǐng)域模型對(duì)設(shè)計(jì)能力要求很高洗鸵,沒(méi)把握用好,一個(gè)錯(cuò)誤的抽象還不如不抽象仗嗦,寧可不要用膘滨,也不要濫用,不要為了DDD而DDD稀拐。*
COLA架構(gòu)各個(gè)包結(jié)構(gòu)的簡(jiǎn)要功能描述火邓,如下表所示:
層次 | 包名 | 功能 | 必選 |
---|---|---|---|
Adapter層 | web | 處理頁(yè)面請(qǐng)求的Controller | 否 |
Adapter層 | wireless | 處理無(wú)線端的適配 | 否 |
Adapter層 | wap | 處理wap端的適配 | 否 |
App層 | executor | 處理request,包括command和query | 是 |
App層 | consumer | 處理外部message | 否 |
App層 | scheduler | 處理定時(shí)任務(wù) | 否 |
Domain層 | model | 領(lǐng)域模型 | 否 |
Domain層 | ability | 領(lǐng)域能力德撬,包括DomainService | 否 |
Domain層 | gateway | 領(lǐng)域網(wǎng)關(guān)铲咨,解耦利器 | 是 |
Infra層 | gatewayimpl | 網(wǎng)關(guān)實(shí)現(xiàn) | 是 |
Infra層 | mapper | ibatis數(shù)據(jù)庫(kù)映射 | 否 |
Infra層 | config | 配置信息 | 否 |
Client SDK | api | 服務(wù)對(duì)外透出的API | 是 |
Client SDK | dto | 服務(wù)對(duì)外的DTO | 是 |
COLA 組件:提供了一些框架級(jí)別的功能,提供應(yīng)用開(kāi)發(fā)所需要的可復(fù)用組件蜓洪,提升研發(fā)效率纤勒。
組件名稱 | 功能 | 版本 | 依賴 |
---|---|---|---|
cola-component-dto | 定義了DTO格式,包括分頁(yè) | 1.0.0 | 無(wú) |
cola-component-exception | 定義了異常格式蝠咆,主要有BizException和SysException | 1.0.0 | 無(wú) |
cola-component-statemachine | 狀態(tài)機(jī)組件 | 1.0.0 | 無(wú) |
cola-component-domain-starter | Spring托管的領(lǐng)域?qū)嶓w組件 | 1.0.0 | 無(wú) |
cola-component-catchlog-starter | 異常處理和日志組件 | 1.0.0 | exception,dto組件 |
cola-component-extension-starter | 擴(kuò)展點(diǎn)組件 | 1.0.0 | 無(wú) |
cola-component-test-container | 測(cè)試容器組件 | 1.0.0 | 無(wú) |
參考:《 COLA 4.0:應(yīng)用架構(gòu)的最佳實(shí)踐》
COLA框架職責(zé)劃分
COLA框架主要分為適配層踊东、應(yīng)用層、Client模塊刚操、領(lǐng)域?qū)诱⒊帷⒒A(chǔ)設(shè)施層
分層架構(gòu)如下:
分包結(jié)構(gòu)如下:
1)適配層(Adapter Layer):負(fù)責(zé)對(duì)前端展示(web,wireless菊霜,wap)的路由和適配坚冀,對(duì)于傳統(tǒng)B/S系統(tǒng)而言,adapter就相當(dāng)于MVC中的controller鉴逞;
2)應(yīng)用層(Application Layer):主要負(fù)責(zé)獲取輸入记某,組裝上下文,參數(shù)校驗(yàn)构捡,調(diào)用領(lǐng)域?qū)幼鰳I(yè)務(wù)處理液南,如果需要的話,發(fā)送消息通知等勾徽。層次是開(kāi)放的滑凉,應(yīng)用層也可以繞過(guò)領(lǐng)域?qū)樱苯釉L問(wèn)基礎(chǔ)實(shí)施層喘帚;
3)Client模塊(Client Module):包含的代碼應(yīng)該是常見(jiàn)的服務(wù)接口Facade和DTO數(shù)據(jù)傳輸對(duì)象畅姊,如API、DTO吹由、領(lǐng)域事件若未、Command和Query對(duì)象等等。
4)領(lǐng)域?qū)樱―omain Layer):主要是封裝了核心業(yè)務(wù)邏輯倾鲫,并通過(guò)領(lǐng)域服務(wù)(Domain Service)和領(lǐng)域?qū)ο螅―omain Entity)的方法對(duì)App層提供業(yè)務(wù)實(shí)體和業(yè)務(wù)邏輯計(jì)算粗合。領(lǐng)域是應(yīng)用的核心萍嬉,不依賴任何其他層次;
5)基礎(chǔ)實(shí)施層(Infrastructure Layer):主要負(fù)責(zé)技術(shù)細(xì)節(jié)問(wèn)題的處理舌劳,比如數(shù)據(jù)庫(kù)的CRUD帚湘、搜索引擎玫荣、文件系統(tǒng)甚淡、分布式服務(wù)的RPC等。此外捅厂,領(lǐng)域防腐的重任也落在這里贯卦,外部依賴需要通過(guò)gateway的轉(zhuǎn)義處理,才能被上面的App層和Domain層使用焙贷。
6)啟動(dòng)模塊(Start Module):Spring Boot的啟動(dòng)類撵割,應(yīng)用入口。沒(méi)有任何邏輯辙芍,只需要配置 application.properties 配置文件啡彬。
CQRS架構(gòu)模式
CQRS架構(gòu)模式,在DDD中是一種很常見(jiàn)的模式故硅,它的用途在于將Command與Query功能進(jìn)行分離庶灿,讓一些復(fù)雜的查詢擺脫領(lǐng)域模型的限制,以更為簡(jiǎn)單的DTO形式展現(xiàn)查詢結(jié)果吃衅。服務(wù)可以獨(dú)立部署往踢,也可以拆分部署。數(shù)據(jù)庫(kù)可以使用一個(gè)徘层,也可以讀寫(xiě)分離峻呕。
在COLA 4.0中,已經(jīng)移除了Command Bus和Query Bus的處理趣效,進(jìn)一步簡(jiǎn)化了COLA架構(gòu)瘦癌。
業(yè)務(wù)調(diào)用時(shí)序圖
我們通過(guò)分三個(gè)場(chǎng)景的UML時(shí)序圖描述一下各模塊之間的調(diào)用關(guān)系。主要差異在于應(yīng)用層中的Command或Query執(zhí)行器的處理過(guò)程跷敬。
場(chǎng)景一:Command或Query執(zhí)行器直接調(diào)用Gateway接口讯私,處理業(yè)務(wù)請(qǐng)求。
場(chǎng)景二:Command或Query執(zhí)行器干花,調(diào)用領(lǐng)域服務(wù)(Domain Service)妄帘,然后領(lǐng)域服務(wù)調(diào)用Gateway完成業(yè)務(wù)請(qǐng)求。
場(chǎng)景三:Command或Query執(zhí)行器直接調(diào)用infrastructure層中定義的Mapper池凄,完成業(yè)務(wù)邏輯處理抡驼。
下面說(shuō)明整體調(diào)用過(guò)程和注意事項(xiàng)。
Adapter接收Cmd/Qry對(duì)象或者參數(shù)列表(Request Param)肿仑。如果請(qǐng)求參數(shù)是參數(shù)列表致盟,則構(gòu)造Cmd/Qry對(duì)象碎税,然后調(diào)用App Service接口。
App服務(wù)接收Cmd/Qry對(duì)象馏锡,然后調(diào)用Cmd/Qry Executor(執(zhí)行器)雷蹂,如上圖所示,分為以下三種場(chǎng)景:
2.1. Command Executor 可以通過(guò)領(lǐng)域?qū)嶓w方法杯道,以及Gateway接口匪煌,實(shí)現(xiàn)簡(jiǎn)單業(yè)務(wù)編排,完成業(yè)務(wù)請(qǐng)求党巾。
2.2. 或者通過(guò)調(diào)用領(lǐng)域服務(wù)(Domain Service)實(shí)現(xiàn)復(fù)雜業(yè)務(wù)邏輯處理萎庭,然后在領(lǐng)域服務(wù)通過(guò)Gateway訪問(wèn)數(shù)據(jù)的持久化。
2.3. 或者直接跳過(guò)Domain層齿拂,在Qry Executor中調(diào)用infrastructure中的Mapper接口驳规,訪問(wèn)數(shù)據(jù)庫(kù)持久化操作。App服務(wù)署海、Command Executor(命令執(zhí)行器)以及Domain Serivce都是無(wú)狀態(tài)服務(wù)吗购,本身不存儲(chǔ)任務(wù)信息。
App服務(wù)負(fù)責(zé)實(shí)現(xiàn)對(duì)外暴露的API服務(wù)砸狞,然后調(diào)用Command Executor.
Domain Service 負(fù)責(zé)封裝一個(gè)領(lǐng)域中跨實(shí)體操作的業(yè)務(wù)邏輯捻勉。App Service 負(fù)責(zé)封裝跨領(lǐng)域?qū)嶓w操作的業(yè)務(wù)邏輯。
Gateway接口用來(lái)隔離技術(shù)實(shí)現(xiàn)細(xì)節(jié)趾代,GatewayImpl實(shí)現(xiàn)領(lǐng)域?qū)佣x的Gate接口贯底,負(fù)責(zé)數(shù)據(jù)的CRUD操作,數(shù)據(jù)庫(kù)測(cè)可以是MySQL撒强、NoSql禽捆、Elasticsearch、Redis飘哨、甚至Hadoop/HBase等
分層架構(gòu)胚想、包結(jié)構(gòu)、業(yè)務(wù)調(diào)用關(guān)系
下圖將COLA分層架構(gòu)芽隆、包結(jié)構(gòu)浊服、業(yè)務(wù)調(diào)用關(guān)系,整合在一張圖中胚吁。
代碼參考:《COLA 4.x架構(gòu)入門(mén)和項(xiàng)目實(shí)踐》