Skip to content

DDD项目结构的演变

下图是我们最原始的订单DDD层级划分,第一版和第二版也是依据此来构建整体项目结构的。

一开始,我们是期望domain、infrastructure、通用域和types是被不同的应用通用的

第一版

  • 目录order-service
    • 目录order-starter/
    • 目录order-starter-job/
    • 目录order-starter-sync/
    • 目录order-interface/
    • 目录order-interface-job/
    • 目录order-interface-sync/
    • 目录order-application/
    • 目录order-application-job/
    • 目录order-application-sync/
    • 目录order-domain/
    • 目录order-infrastructure/
    • 目录order-types/
    • 目录order-common/
    • pom.xml
缺点

可读性不高,和图对应不上,starter、interface、application都平铺开了,moudle很多,对于新同学不友好

第二版

  • 目录order-service
    • 目录order-starter-parent
      • 目录order-starter/
      • 目录order-job-starter/
      • 目录order-sync-starter/
      • pom.xml
    • 目录order-interface-parent
      • 目录order-interface/
      • 目录order-interface-job/
      • 目录order-interface-sync/
      • pom.xml
    • 目录order-application-parent
      • 目录order-application/
      • 目录order-application-job/
      • 目录order-application-sync/
      • pom.xml
    • 目录order-domain/
    • 目录order-infrastructure/
    • 目录order-types/
    • 目录order-common/
    • pom.xml
优点

解决了第一版可读性的问题

缺点

会增加发版频率,例如只改了order-job应用,但是因为变动改到了domain或infrastructure等复用的moudle,会迫使其他两个应用也要同步发版。这个对于线上服务的稳定性来说是有一定的冲击。

但是换一个角度来思考,如果都发版也是合理的,因为当做bug处理就应该发版。

这个其实在我们团队内部是有争议的,经过团队的沟通,我们采用了第三版,拆分。拆分的原因思考后,也是合理的,具体见第三版

第三版

  • 目录order-service
    • 目录order-bootstrap/
      • OrderServiceBootstrap.java
    • 目录order-interface/
      • OrderController.java
    • 目录order-application/
      • OrderApplicatonService.java
    • 目录order-domain/
      • OrderAggragate.java
    • 目录order-infrastructure/
    • 目录order-types/
    • 目录order-common/
    • pom.xml
  • 目录order-sync
    • 目录order-sync-bootstrap/
    • 目录order-sync-interface/
    • 目录order-sync-application/
    • 目录order-sync-domain/
    • 目录order-sync-infrastructure/
    • 目录order-sync-types/
    • 目录order-sync-common/
    • pom.xml

order-service单独拆成一个仓库,用于处理主线业务

order-sync和order-job合并为order-sync服务。处理非核心业务。将job合并到sync的原因经过评估后,差别不大,都是异步的,只不过一个是批处理异步、一个是消费消息的异步。

在我之前的公司job和sync是拆开的。所以这里我想说的一点是,符合公司、团队的才是最好的,不一定都要按照某个规范来。大家灵活变通即可

为什么要拆仓库?为什么不复用底层moudle了?

我先回答第二个问题,为什么不复用底层moudle了?因为每个应用所负责的功能侧重点不同,domain、infrastructure等都会渐渐的产生区别,会变得越来越符合当前应用的职责。故第一个问题也就自然有答案了,就是拆。 既然后面差别会越来越大,还不如趁早拆开。而拆开后就自然而然解决了第二版方案中缺点

总结

DDD只是思想,每个人对DDD的理解不同,自然项目结构也会不同,只要能解决问题就行。如果严格按照DDD的规范来做,就有点矫枉过正了。在DDD的实践过程中,允许一定的妥协。

我这里也只是分享出来,仅供大家参考。如果有想法或者建议,欢迎留言讨论

项目结构更新 2024.6.9

在实践过程中,发现

  • order-types在order-sync服务和order-service中会经常会被使用到,而order-types在order-service中维护,会导致有时并不需要动order-service的代码却因为 需要动order-types而被动到
  • order-common在order-sync和order-service中的高度相似,因此可以考虑独立出来

基于以上两点考虑,新建了一个仓库order-framework,用来管理order-types和order-common

order-framework
  • 目录order-framework
    • 目录order-types/
    • 目录order-common/
    • pom.xml
order-sync和order-service代码组织结构变化
  • 目录order-sync
    • 目录order-sync-bootstrap/
    • 目录order-sync-interface/
    • 目录order-sync-application/
    • 目录order-sync-domain/
    • 目录order-sync-infrastructure/
    • pom.xml
  • 目录order-service
    • 目录order-bootstrap/
    • 目录order-interface/
    • 目录order-application/
    • 目录order-domain/
    • 目录order-infrastructure/
    • pom.xml

网站当前构建日期: 2024.09.28