腳手架實(shí)戰(zhàn):DDD四層架構(gòu)入門)
MateCloud微服務(wù)腳手架實(shí)戰(zhàn)DDD四層架構(gòu)入門【免費(fèi)下載鏈接】matecloudMateCloud是一款基于Spring Cloud Alibaba的微服務(wù)架構(gòu)。目前已經(jīng)整合Spring Boot 4.0.7、 SpringCloud 2025、Spring Cloud Alibaba 2025、Spring Security Oauth2、Feign、Dubbo、JetCache、RocketMQ等支持多租戶的低代碼平臺(tái)Saas平臺(tái)開發(fā)套件項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ma/matecloudMateCloud 是一款基于 Spring Cloud Alibaba 的微服務(wù)腳手架用 DDD 四層架構(gòu)把業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)、消息等技術(shù)細(xì)節(jié)分開內(nèi)置網(wǎng)關(guān)、認(rèn)證、系統(tǒng)管理、通知等服務(wù)和一批即插即用的 Starter主打多租戶 SaaS 場(chǎng)景。一、CRUD 寫到后面為什么越來(lái)越難改想象一個(gè)常見(jiàn)的場(chǎng)景用戶服務(wù)里的 Service 類一半代碼在查庫(kù)一半在發(fā)事件還有權(quán)限判斷、租戶判斷、密碼加密穿插其中。最初還好需求一來(lái)一個(gè)加個(gè)凍結(jié)、加個(gè)批量導(dǎo)入、加個(gè)操作審計(jì)這個(gè)類很快就沒(méi)人敢動(dòng)了——改一行怕碰掉別的邏輯。MateCloud 的解法不是給這個(gè)類減肥而是按職責(zé)把它拆成四層trigger只接外部請(qǐng)求application編排用例domain裝業(yè)務(wù)規(guī)則infrastructure管數(shù)據(jù)庫(kù)和外部系統(tǒng)。下面以 mate-system 的用戶模塊為例看它是怎么落地的。二、依賴方向倒過(guò)來(lái)只記住這一件事四層里最核心的主張只有一條domain 層不依賴任何框架。用戶聚合根、實(shí)體、狀態(tài)枚舉都是純 Java 對(duì)象領(lǐng)域服務(wù)類上甚至沒(méi)有 Spring 注解靠基礎(chǔ)設(shè)施層的配置類手動(dòng)注冊(cè)成 Bean連密碼怎么加密都抽象成一個(gè)端口接口由基礎(chǔ)設(shè)施層去實(shí)現(xiàn)。依賴方向是反的domain 定義UserRepository這樣的接口infrastructure 來(lái)實(shí)現(xiàn)它。業(yè)務(wù)規(guī)則不再追著技術(shù)實(shí)現(xiàn)跑——換 MyBatis-Plus 成別的持久層只動(dòng)最外圈那一層領(lǐng)域邏輯的單元測(cè)試不用啟動(dòng) Spring 容器new一個(gè)聚合根就能測(cè)。三、跟著一筆創(chuàng)建用戶請(qǐng)求走完請(qǐng)求先到 mate-gateway過(guò)完鑒權(quán)后路由到 mate-system 的UserController控制器只做兩件事參數(shù)校驗(yàn)、權(quán)限注解然后轉(zhuǎn)手給應(yīng)用層。接下來(lái)是最關(guān)鍵的編排步驟整個(gè)方法也就十來(lái)行Transactional(rollbackFor Exception.class) public String createUser(RegisterUserCommand command) { tenantQuotaService.assertCanAddUser(TenantContext.getTenantId()); UserAggregate aggregate userDomainService.createUser( command.getUsername(), command.getPassword(), ...); userRepository.save(aggregate); eventPublisher.publish(new UserCreatedEvent(...)); return aggregate.getId(); }應(yīng)用層做四件事先查租戶配額再讓領(lǐng)域服務(wù)構(gòu)造聚合根查重、加密都在里面交給倉(cāng)儲(chǔ)落庫(kù)最后發(fā)一個(gè)領(lǐng)域事件。注意事件監(jiān)聽(tīng)器要求AFTER_COMMIT才觸發(fā)回滾不會(huì)產(chǎn)生幽靈事件。領(lǐng)域?qū)邮且?guī)則真正住的地方。以凍結(jié)為例狀態(tài)變更和審計(jì)記錄被封裝在聚合根的一個(gè)方法里調(diào)用方?jīng)]法跳過(guò)審計(jì)直接改狀態(tài)public void freeze() { user.freeze(); addOperateStream(UserOperateType.FREEZE, User frozen); }最后是 infrastructure 層把領(lǐng)域?qū)ο筠D(zhuǎn)成 PO 插入數(shù)據(jù)庫(kù)操作流水跟著同一次寫入。讀走另一條路——查詢服務(wù)直接返回 DTO不碰聚合根這就是它內(nèi)置的 CQRS 讀寫分離。四、這套設(shè)計(jì)實(shí)際幫到你什么業(yè)務(wù)規(guī)則只有一份凍結(jié)、改密、刪除的狀態(tài)約束都收在聚合根里Controller、RPC、Excel 導(dǎo)入三條入口走的是同一條規(guī)則不會(huì)出現(xiàn)接口能凍結(jié)、批量接口不能凍結(jié)這種不一致。技術(shù)變更有邊界換持久層、換加密算法影響范圍被限制在 infrastructure 層不用翻遍業(yè)務(wù)代碼。測(cè)試成本下降domain 層不依賴容器業(yè)務(wù)規(guī)則的單元測(cè)試直接寫、直接跑不用先起一套數(shù)據(jù)庫(kù)。五、新手第一步看哪里建議按這個(gè)順序先git clone https://gitcode.com/GitHub_Trending/ma/matecloud跑mvn clean install -DskipTests再用倉(cāng)庫(kù)里的 docker-compose 把 MySQL、Redis、RabbitMQ、Nacos、MinIO 拉起來(lái)啟動(dòng)網(wǎng)關(guān)和 mate-system。代碼閱讀從用戶模塊入手它是完整度最高的示例聚合根、值對(duì)象、倉(cāng)儲(chǔ)實(shí)現(xiàn)、領(lǐng)域事件一個(gè)不少目錄結(jié)構(gòu)見(jiàn) mate-biz/mate-system。想理解每層的設(shè)計(jì)約定再翻 DDD 分層設(shè)計(jì)文檔那里把各層的職責(zé)邊界寫得很細(xì)。六、容易踩的幾個(gè)坑別把四層當(dāng)教條往每個(gè)類里套mate-system 里的管理員子域是另一套分層和用戶域互相獨(dú)立不要跨域直接拿對(duì)方的實(shí)體用。批量操作的事務(wù)邊界別包大項(xiàng)目里批量?jī)鼋Y(jié)/刪除是逐條走獨(dú)立事務(wù)、逐條收集失敗原因外層故意不加事務(wù)——你包一個(gè)外層事務(wù)進(jìn)去第一條失敗整批回滾。領(lǐng)域事件要等提交自己寫監(jiān)聽(tīng)器時(shí)記得用AFTER_COMMIT語(yǔ)義否則回滾的請(qǐng)求也會(huì)把事件發(fā)出去下游會(huì)收到不存在的用戶創(chuàng)建。本地把用戶模塊跑起來(lái)之后照著現(xiàn)有模式給聚合根加一個(gè)領(lǐng)域操作是理解這套微服務(wù)腳手架最快的方式。【免費(fèi)下載鏈接】matecloudMateCloud是一款基于Spring Cloud Alibaba的微服務(wù)架構(gòu)。目前已經(jīng)整合Spring Boot 4.0.7、 SpringCloud 2025、Spring Cloud Alibaba 2025、Spring Security Oauth2、Feign、Dubbo、JetCache、RocketMQ等支持多租戶的低代碼平臺(tái)Saas平臺(tái)開發(fā)套件項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ma/matecloud創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考