自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇帶你了解DDD四層微服務(wù)架構(gòu)

開發(fā) 架構(gòu)
DDD建模與落地的這幾年,收獲了不少好評(píng),也著實(shí)為業(yè)務(wù)成功做出了貢獻(xiàn),優(yōu)化了大半年,如今終于可以跟大家正式見(jiàn)面了。

一、微服務(wù)搭建思路

大家看到的這張架構(gòu)圖并不是空穴來(lái)潮,它是通過(guò)不斷演變出來(lái)的,我們要從DDD四層架構(gòu)、微服務(wù)架構(gòu)兩個(gè)維度去融合理解。

這里的DDD四層架構(gòu)適用于單個(gè)服務(wù)的工程架構(gòu)(如圖中的左下部分),就是單體應(yīng)用的DDD四層架構(gòu)的包劃分方式。

而微服務(wù)架構(gòu),則是從整體去看,整合多個(gè)單體應(yīng)用,它們之間通過(guò)應(yīng)用SDK工程進(jìn)行RPC通訊。

二、微服務(wù)架構(gòu)下的應(yīng)用SDK

這個(gè)工程比較好理解,類似于我們傳統(tǒng)的理解的RPC包,或者叫API包,在Maven工程里,一般定義為一個(gè)子Module,里面主要定義的是Feign接口(如service.XxxFeignService),DTO對(duì)象(contract.dto.XxxRequest/XxxResponse)等等,此外還可以對(duì)FeignService返回的數(shù)據(jù)進(jìn)行清洗與簡(jiǎn)單通用的封裝(如util.XxxUtil),也就是說(shuō)它還能封裝簡(jiǎn)單的業(yè)務(wù)邏輯。

但需要特別注意:應(yīng)用SDK要往一個(gè)大尺度獨(dú)立的聚合工程的方向去搭建,它里面的頂層包要按內(nèi)部業(yè)務(wù)系統(tǒng)的維度去隔離,并且它和業(yè)務(wù)系統(tǒng)不是一對(duì)一的關(guān)系。

為什么要這樣設(shè)計(jì)?我講個(gè)例子你就明白了。

我們公司的業(yè)務(wù)系統(tǒng)在頂層劃分為SaaS應(yīng)用和PaaS應(yīng)用,那么PaaS應(yīng)用對(duì)應(yīng)的應(yīng)用SDK可以命名為PaaSSdk,在PaaSSdk工程里,包括了消息中心、ChatAI、應(yīng)用市場(chǎng)等PaaS應(yīng)用的外部接口封裝與簡(jiǎn)單業(yè)務(wù)邏輯封裝。

這樣做的好處顯而易見(jiàn)——SaaS應(yīng)用需要用到PaaS應(yīng)用的接口時(shí),只需要引入PaaSSdk即可,原則上這個(gè)內(nèi)部Sdk與我們平時(shí)引入的外部Jar包沒(méi)什么區(qū)別,可能只是網(wǎng)關(guān)和鑒權(quán)體系不一樣罷了。

而且,簡(jiǎn)單的業(yè)務(wù)系統(tǒng)就用一個(gè)module就好了,沒(méi)必要再拆分多個(gè)module,要知道,每引入多一個(gè)東西就有更多的不確定性。

所以你也就能理解,為什么這里的應(yīng)用Sdk與業(yè)務(wù)系統(tǒng)不是一對(duì)一的關(guān)系,如果是一對(duì)一,業(yè)務(wù)系統(tǒng)勢(shì)必要引入大量的Jar包,這在維護(hù)成本上是個(gè)災(zāi)難。試想一下,如果要用到阿里云OSS的Jar包時(shí),你會(huì)引入大量POM嗎?

三、DDD四層架構(gòu)下的業(yè)務(wù)工程

DDD建模與落地的這幾年,收獲了不少好評(píng),也著實(shí)為業(yè)務(wù)成功做出了貢獻(xiàn),優(yōu)化了大半年,如今終于可以跟大家正式見(jiàn)面了。

先談架構(gòu)思想:

  • 經(jīng)典DDD四層架構(gòu):作為主要骨架,其他優(yōu)秀架構(gòu)思想作指導(dǎo)
  • 整潔架構(gòu)思想:應(yīng)用到DDD領(lǐng)域?qū)优c基礎(chǔ)設(shè)施層,接口與實(shí)現(xiàn)拆到不同層,把技術(shù)代碼與業(yè)務(wù)代碼分離
  • 菱形架構(gòu)思想:內(nèi)部以領(lǐng)域?qū)拥念I(lǐng)域模型為核心,向南北兩個(gè)方向發(fā)散
  • D3boot基礎(chǔ)框架:作為基礎(chǔ)設(shè)施,提供基礎(chǔ)CRUD接口、BOM依賴等基礎(chǔ)封裝,應(yīng)用在各層,簡(jiǎn)化鏈接,是快速搭建應(yīng)用SDK、業(yè)務(wù)系統(tǒng)的粘合劑

DDD四層架構(gòu)說(shuō)明:

  • 接入層:對(duì)外提供的系統(tǒng)入口/接口,如放Controller類,并按端劃分(這里的client包寫移動(dòng)端接口,admin包寫管理端接口,open包寫開放接口)
  • 應(yīng)用層:跨聚合的服務(wù)編排service.XxxAppService、跨聚合領(lǐng)域事件監(jiān)聽event.XxxListener,實(shí)體工廠factory.XxxFactory
  • 領(lǐng)域?qū)樱憾x核心業(yè)務(wù)規(guī)則,與具體技術(shù)無(wú)關(guān),不依賴其他各層;服務(wù)內(nèi)按領(lǐng)域聚合劃分,外部聚合external.xxx按限界上下文(微服務(wù))劃分;model定義充血模型、值對(duì)象,repository定義倉(cāng)庫(kù)接口,service定義聚合內(nèi)的領(lǐng)域服務(wù),event定義聚合內(nèi)的領(lǐng)域事件監(jiān)聽器;領(lǐng)域契約contract包含:API層特殊出入?yún)to.XxxRequest/dto.XxxResponse、數(shù)據(jù)查詢參數(shù)param.XxxParam、領(lǐng)域事件event.XxxEvent
  • 基礎(chǔ)設(shè)施層:具體技術(shù)相關(guān)的代碼/框架、倉(cāng)庫(kù)層實(shí)現(xiàn)repository.impl.XxxRepositoryImpl,包括數(shù)據(jù)聚合實(shí)現(xiàn)(fill方法);external放外部服務(wù)實(shí)現(xiàn),做接口防腐

四、集成D3boot基礎(chǔ)框架

領(lǐng)導(dǎo)讓你搭個(gè)業(yè)務(wù)系統(tǒng),如果什么都從零開始的話,項(xiàng)目周期就太長(zhǎng)了。我們?cè)诖罱ㄏ到y(tǒng)的過(guò)程中,如果有這么一個(gè)框架,能夠快速解決CRUD、工程結(jié)構(gòu)劃分等等問(wèn)題就好了。

D3boot基礎(chǔ)框架的出現(xiàn),正是為了解決這個(gè)問(wèn)題。一般SpringBoot只能集成Spring體系內(nèi)的技術(shù)棧,但作為心態(tài)更開放的我們,不應(yīng)把目光聚焦在Spring體系內(nèi),每家企業(yè)都應(yīng)該有自己的基礎(chǔ)框架。

D3boot,意為DDD工程快速啟動(dòng),其中融入了DDD領(lǐng)域驅(qū)動(dòng)的架構(gòu)思想,并且能處處體現(xiàn)充血模型帶來(lái)的CRUD上的便利,還支持SaaS應(yīng)用的搭建(租戶隔離)。D3boot框架旨在快速搭建SaaS業(yè)務(wù)系統(tǒng),減少繁瑣的CRUD定義,減少不必要的xml代碼書寫。

充血模型的思想體現(xiàn)在對(duì)Model的繼承,即可實(shí)現(xiàn)你想要的CRUD;而通過(guò)領(lǐng)域工廠(Factory的build、convert、fill等方式),又可以利用貧血模型思想的優(yōu)勢(shì),對(duì)復(fù)雜的對(duì)象進(jìn)行構(gòu)建、轉(zhuǎn)換、填充,彌補(bǔ)了充血模型的不足。

目前我已使用這套輕量級(jí)微服務(wù)基礎(chǔ)框架,在公司里的健康管理平臺(tái)、消息中臺(tái)、工單中臺(tái)、社交中臺(tái)、ChatAI等業(yè)務(wù)系統(tǒng)應(yīng)用了起來(lái),使用感受一個(gè)字:舒服。

而作為基礎(chǔ)框架,考慮的更多是不同框架集成的問(wèn)題、功能邊界問(wèn)題,接下來(lái)我給大家一一介紹。

以下是D3boot的結(jié)構(gòu):

1.base:基礎(chǔ)組件

可擴(kuò)展的基礎(chǔ)組件,下面包括多個(gè)子模塊,包括:

base-core:基礎(chǔ)核心組件:

定義了基礎(chǔ)核心上下文(如SpringContext、ThreadContext、BaseContext)、核心契約(如R對(duì)象、Page對(duì)象、抽象領(lǐng)域事件、業(yè)務(wù)異常、統(tǒng)一狀態(tài)碼等)、核心工具類(如Bean轉(zhuǎn)換工具、Json轉(zhuǎn)換工具、業(yè)務(wù)斷言工具等)。

base-data:基礎(chǔ)數(shù)據(jù)組件:

定義了基礎(chǔ)模型(支持CRUD的充血模型)、基礎(chǔ)倉(cāng)庫(kù)及MybatisPlus的倉(cāng)庫(kù)實(shí)現(xiàn)、數(shù)據(jù)類型處理器等,支持通過(guò)@TenantId注解PO類租戶字段來(lái)隔離租戶數(shù)據(jù)等。用到數(shù)據(jù)庫(kù)的工程需要依賴此包。

base-mq:基礎(chǔ)MQ組件:

目前集成了Kafka消息隊(duì)列,可快速通過(guò)注解方式實(shí)現(xiàn)MQ消費(fèi)。

base-kit:基礎(chǔ)工具箱:

工具類,底下按不同的能力又細(xì)分為緩存類、事件類、語(yǔ)言類、線程類、WEB類工具。

base-monitor:基礎(chǔ)監(jiān)控組件:

集成HealthCheck接口、啟動(dòng)打印代碼版本功能、日志告警功能(能把log.error的日志告警到企微機(jī)器人/釘釘機(jī)器人)。

base-web:基礎(chǔ)WEB組件:

定義了CRUD控制器基類CRUDController、按端劃分的模型控制器接口ModelController、全局異常增強(qiáng)、全局R對(duì)象包裝、全局Feign異常降級(jí)、各類WEB攔截器、基礎(chǔ)接口認(rèn)證功能等。WEB工程需要依賴此包。

2.base-bom:基礎(chǔ)依賴組件

Maven的BOM(Bill of Materials)機(jī)制是Maven項(xiàng)目中的一個(gè)重要概念,它用于管理項(xiàng)目的依賴關(guān)系和版本控制。BOM機(jī)制可以幫助開發(fā)人員快速構(gòu)建和維護(hù)項(xiàng)目,并且可以確保項(xiàng)目的穩(wěn)定性和可靠性。

Spring有自己的bom文件,如spring-boot-dependencies,里面定義了構(gòu)建SpringBoot工程所需要的依賴。

參考Spring的方式,我們把第三方的依賴統(tǒng)一在base-bom組件里進(jìn)行管理,這樣一來(lái),業(yè)務(wù)工程只需要引入對(duì)應(yīng)的dependency即可(包括定義D3boot框架里的組件版本),不需要再在業(yè)務(wù)系統(tǒng)過(guò)多地指定用哪個(gè)版本,達(dá)到版本統(tǒng)一的效果。

3.base-contract-parent:業(yè)務(wù)Contract父工程組件

作為應(yīng)用SDK工程的父POM,快速搭建應(yīng)用SDK。

4.base-parent:業(yè)務(wù)父工程組件

作為業(yè)務(wù)工程的父POM,快速搭建業(yè)務(wù)系統(tǒng)。

5.ddd-demo:DDDDemo工程

基于D3boot框架搭建的DDD四層架構(gòu)風(fēng)格的業(yè)務(wù)工程,寫得比較粗糙,具體參考架構(gòu)圖的實(shí)現(xiàn)為準(zhǔn)。

五、寫在最后

我一直認(rèn)為,基礎(chǔ)框架不能寫得太重,公司的公共組件不應(yīng)放在基礎(chǔ)框架工程內(nèi)實(shí)現(xiàn),而是另外定制。在基礎(chǔ)框架的開發(fā)過(guò)程中,我不斷汲取前輩的優(yōu)秀代碼經(jīng)驗(yàn),并融入自己的代碼特色,提煉高復(fù)用性代碼,并對(duì)中間件進(jìn)行淺封裝。

此外,本著技術(shù)開放的心態(tài),這套基礎(chǔ)框架決定走開源路線,大家可以下載Deploy到自己的私倉(cāng)使用,基于自己公司的業(yè)務(wù)進(jìn)一步定制自己的基礎(chǔ)組件。

Gitee源碼地址:https://gitee.com/jensvn/d3boot(例行賒Star)

D3boot基礎(chǔ)框架具體的使用方式見(jiàn)源碼的README.md文件,這里不再贅述。

責(zé)任編輯:姜華 來(lái)源: 架構(gòu)師修行錄
相關(guān)推薦

2023-11-24 07:16:10

DDD微服務(wù)

2022-02-22 08:15:59

微服務(wù)架構(gòu)單體架構(gòu)

2021-05-20 06:57:16

RabbitMQ開源消息

2023-02-20 09:55:00

微服務(wù)框架單體架構(gòu)

2023-06-16 07:41:36

分層架構(gòu)軟件架構(gòu)

2023-01-05 07:52:36

高可用架構(gòu)消息隊(duì)列

2023-05-12 08:19:12

Netty程序框架

2021-07-14 08:24:23

TCPIP 通信協(xié)議

2021-06-30 00:20:12

Hangfire.NET平臺(tái)

2021-07-28 10:02:54

建造者模式代碼

2021-08-11 07:02:21

npm包管理器工具

2021-08-02 06:34:55

Redis刪除策略開源

2021-11-08 08:42:44

CentOS Supervisor運(yùn)維

2021-11-24 08:51:32

Node.js監(jiān)聽函數(shù)

2021-12-15 11:52:34

GPLLinuxGNU

2021-07-08 06:30:03

Linux CPULinux 系統(tǒng)

2022-02-23 09:36:11

GoRuby編程語(yǔ)言

2020-11-10 10:48:10

JavaScript屬性對(duì)象

2021-01-29 18:41:16

JavaScript函數(shù)語(yǔ)法

2021-02-02 18:39:05

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)