建筑企業(yè)管理咨詢公司是做什么的品牌關(guān)鍵詞優(yōu)化
文章目錄
- 1. DDD四層架構(gòu)
- 2. 項目搭建
1. DDD四層架構(gòu)
技術(shù):SpringBoot、Mybatis、Dubbo、MQ、Redis、Mysql、ELK、分庫分表、Otter
架構(gòu):DDD 領(lǐng)域驅(qū)動設(shè)計、充血模型、設(shè)計模式
-
應(yīng)用層{application}
應(yīng)用服務(wù)位于應(yīng)用層。用來表述應(yīng)用和用戶行為,負責(zé)服務(wù)的組合、編排和轉(zhuǎn)發(fā),負責(zé)處理業(yè)務(wù)用例的執(zhí)行順序以及結(jié)果的拼裝。
應(yīng)用層的服務(wù)包括應(yīng)用服務(wù)和領(lǐng)域事件相關(guān)服務(wù)。
應(yīng)用服務(wù)可對微服務(wù)內(nèi)的領(lǐng)域服務(wù)以及微服務(wù)外的應(yīng)用服務(wù)進行組合和編排,或者對基礎(chǔ)層如文件、緩存等數(shù)據(jù)直接操作形成應(yīng)用服務(wù),對外提供粗粒度的服務(wù)。
領(lǐng)域事件服務(wù)包括兩類:領(lǐng)域事件的發(fā)布和訂閱。通過事件總線和消息隊列實現(xiàn)異步數(shù)據(jù)傳輸,實現(xiàn)微服務(wù)之間的解耦。 -
領(lǐng)域?qū)觷domain}
領(lǐng)域服務(wù)位于領(lǐng)域?qū)?#xff0c;為完成領(lǐng)域中跨實體或值對象的操作轉(zhuǎn)換而封裝的服務(wù),領(lǐng)域服務(wù)以與實體和值對象相同的方式參與實施過程。
領(lǐng)域服務(wù)對同一個實體的一個或多個方法進行組合和封裝,或?qū)Χ鄠€不同實體的操作進行組合或編排,對外暴露成領(lǐng)域服務(wù)。領(lǐng)域服務(wù)封裝了核心的業(yè)務(wù)邏輯。實體自身的行為在實體類內(nèi)部實現(xiàn),向上封裝成領(lǐng)域服務(wù)暴露。
為隱藏領(lǐng)域?qū)拥臉I(yè)務(wù)邏輯實現(xiàn),所有領(lǐng)域方法和服務(wù)等均須通過領(lǐng)域服務(wù)對外暴露。
為實現(xiàn)微服務(wù)內(nèi)聚合之間的解耦,原則上禁止跨聚合的領(lǐng)域服務(wù)調(diào)用和跨聚合的數(shù)據(jù)相互關(guān)聯(lián)。 -
基礎(chǔ)層{infrastructure}
基礎(chǔ)服務(wù)位于基礎(chǔ)層。為各層提供資源服務(wù)(如數(shù)據(jù)庫、緩存等),實現(xiàn)各層的解耦,降低外部資源變化對業(yè)務(wù)邏輯的影響。
基礎(chǔ)服務(wù)主要為倉儲服務(wù),通過依賴反轉(zhuǎn)的方式為各層提供基礎(chǔ)資源服務(wù),領(lǐng)域服務(wù)和應(yīng)用服務(wù)調(diào)用倉儲服務(wù)接口,利用倉儲實現(xiàn)持久化數(shù)據(jù)對象或直接訪問基礎(chǔ)資源。 -
接口層{interfaces}
接口服務(wù)位于用戶接口層,用于處理用戶發(fā)送的Restful請求和解析用戶輸入的配置文件等,并將信息傳遞給應(yīng)用層。
綜上,就是對 DDD 領(lǐng)域驅(qū)動設(shè)計的一個基本描述,不過也不用過于神秘化DDD,我們可以把DDD四層架構(gòu)和MVC三層架構(gòu)架構(gòu)理解為家里的格局,三居和四居,只不過DDD是在MVC的基礎(chǔ)上可以更加明確了房間的布局,可能效果上就像你原來有個三居中沒有獨立的書房,現(xiàn)在四居了你可以有一個自己的小空間了。
那么,這里還有一點就是DDD結(jié)構(gòu)它是一種充血模型結(jié)構(gòu),所有的服務(wù)實現(xiàn)都以領(lǐng)域為核心,應(yīng)用層定義接口,領(lǐng)域?qū)訉崿F(xiàn)接口,領(lǐng)域?qū)佣x數(shù)據(jù)倉儲,基礎(chǔ)層實現(xiàn)數(shù)據(jù)倉儲中關(guān)于DAO和Redis的操作,但同時幾方又有互相的依賴。那么這樣的結(jié)構(gòu)再開發(fā)獨立領(lǐng)域提供 http 接口時候,并不會有什么問題體現(xiàn)出來。但如果這個時候需要引入 RPC 框架,就會暴露問題了,因為使用 RPC 框架的時候,需要對外提供描述接口信息的 Jar 讓外部調(diào)用方引入才可以通過反射調(diào)用到具體的方法提供者,那么這個時候,RPC 需要暴露出來,而 DDD 的系統(tǒng)結(jié)構(gòu)又比較耦合,怎么進行模塊化的分離就成了問題點。所以我們本章節(jié)在模塊系統(tǒng)結(jié)構(gòu)搭建的時候,也是以解決此項問題為核心進行處理的。
DDD + RPC,模塊分離系統(tǒng)搭建:
如果按照模塊化拆分,那么會需要做一些處理,包括:
- 應(yīng)用層,不再給領(lǐng)域?qū)佣x接口,而是自行處理對領(lǐng)域?qū)咏涌诘陌b。否則領(lǐng)域?qū)蛹纫肓藨?yīng)用層的Jar,應(yīng)用層也引入了領(lǐng)域?qū)拥腏ar,就會出現(xiàn)循環(huán)依賴的問題。
- 基礎(chǔ)層中的數(shù)據(jù)倉儲的定義也需要從領(lǐng)域?qū)觿冸x,否則也會出現(xiàn)循環(huán)依賴的問題。
RPC 層定義接口描述,包括:入?yún)eq、出參Res、DTO對象,接口信息,這些內(nèi)容定義出來的Jar給接口層使用,也給外部調(diào)用方使用。
2. 項目搭建
按照現(xiàn)有工程的結(jié)構(gòu)模塊分層,包括:
lottery-application,應(yīng)用層,引用:domain
lottery-common,通用包,引用:無
lottery-domain,領(lǐng)域?qū)?#xff0c;引用:infrastructure
lottery-infrastructure,基礎(chǔ)層,引用:無
lottery-interfaces,接口層,引用:application、rpc
lottery-rpc,RPC接口定義層,引用:common
在此分層結(jié)構(gòu)和依賴引用下,各層級模塊不能循環(huán)依賴
,同時 lottery-interfaces 作為系統(tǒng)的 war
包工程,在構(gòu)建工程時候需要依賴于 POM 中配置的相關(guān)信息。那這里就需要注意下,作為 LotterySystem 工程下的主 pom.xml 需要完成對 SpringBoot 父文件的依賴
,此外還需要定義一些用于其他模塊可以引入的配置信息,比如:jdk版本
、編碼方式
等。而其他層在依賴于工程總 pom.xml 后還需要配置自己的信息。
lottery-interfaces 是整個程序的出口,也是用于構(gòu)建 War 包的工程模塊,所以你會看到一個 打包方式 war
的配置。
在 SpringBoot 的使用中,你會看到各種 xxx-starter,它們這些組件的包裝都是用于完成橋梁的作用,把一些服務(wù)交給 SpringBoot 啟動時候初始化或者加載配置等操作。