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