「提醒」:是付费专栏,但是在知识星球里是免费的。目前星球里已更新了「几亿用户,百万并发的C端商品系统实战」和「DDD领域驱动设计三年落地实战」,后续的订单,支付,结算和购物车专栏,星球内也都是免费的。
DDD在团队里跑了三年
三年前,CTO要求所有微服务必须用DDD来组织代码。没有太多商量的余地,就是一个硬性要求。我当时对DDD的了解停留在看过几篇文章的程度,聚合根、限界上下文这些词知道,但具体怎么落到Java代码里,没有概念。
没办法,只能摸着石头过河。买了Eric Evans和Vaughn Vernon的书,翻了一堆国内外的博客和课程,然后在项目里一点点试。第一个聚合根写出来的时候,心里完全没底,不确定这样写到底对不对。
三年下来,踩过不少坑。聚合的边界划错了,后来发现两个实体的一致性根本不需要放在一起;领域服务和应用服务的职责分不清,同一段逻辑搬来搬去;值对象到底该不该用,用了之后MyBatis Plus的映射怎么处理。这些问题都是在写代码的过程中一个个碰到、一个个解决的。
到现在,团队里所有微服务都跑在这套DDD结构上,每个人都能按这套规范写代码。这个专栏要写的,就是这三年积累下来的东西。不是理论推演,是实际跑在生产环境里的代码结构和设计决策。
先写代码,再讲概念
DDD相关的文章和课程不少,我自己也看过很多。一个普遍的问题是:大部分内容上来就讲战略设计、事件风暴、领域建模,画一堆框图,定义一堆术语。看的时候觉得每个字都认识,合在一起就是不知道怎么落到代码里。
很多人跟我反馈过同样的感受:DDD的概念太抽象了,看完书还是不知道自己的项目该怎么改。聚合根是什么?我的Service里那些业务逻辑该往哪放?Repository和DAO有什么区别?这些问题在纯理论的语境下很难回答清楚。
这个专栏换个方式。我不从战略设计讲起,不画领域模型图,不做事件风暴。我从数据库表开始。
具体来说,我会拿出几张真实的业务表(订货单、配货单、收货单、统计表),从这些表的字段和关系出发,一步步演示:哪些字段该归到一个聚合根里,哪些该拆成子实体,哪些该提炼成值对象,业务规则该写在哪个类里,跨模块的调用该怎么组织。
每一个DDD概念,都是从具体的代码问题中引出来的。 你会发现,当代码摆在面前的时候,那些抽象的术语突然就有了着落。聚合根不再是一个空洞的名词,而是你手里那个持有子实体列表、对外暴露行为方法的Java类。
整个专栏的主线是这样的:从数据库表出发 → 建立聚合 → 分层 → 编排 → 跨上下文协作。每一步都有代码,每个概念都能对应到具体的类和方法。

贯穿全专栏的业务案例
专栏用一套完整的业务系统作为案例,包含四个模块:
- 订货模块:门店通过小程序提交订货单,包含多个物料明细
- 配货模块:系统按物料所属供应商拆成配货单,供应商在管理后台发货
- 收货模块:门店基于配货单的发货数量进行收货,收货后更新配货单的收货数量
- 统计模块:订货单生成后,异步生成统计记录
四个模块之间有明确的数据流转关系,也有跨模块的协作需求。这套案例能覆盖DDD中绝大多数落地场景:聚合根的设计、子实体的管理、领域服务、应用服务编排、领域事件、跨限界上下文操作。

专栏项目是一个单Maven工程,订货、配货、收货、统计作为工程内的package组织。代码按生产标准设计,保留了核心字段和业务逻辑,裁剪掉了和DDD无关的基础设施细节。
读完这个专栏,你能拿着自己项目里的任何一个模块,按同样的方式做DDD改造。不需要重写,不需要换框架,在现有的Spring Boot + MyBatis Plus技术栈上就能做。
关于这个专栏的一些说明
DDD没有标准答案。Eric Evans的那本书定义了核心概念,Vaughn Vernon的书给出了实现层面的参考,各家公司的落地方式也都不完全一样。
我用的这套DDD,是在三年实践中逐渐形成的。有些做法和书上讲的一致,有些是根据实际项目的情况做了取舍和变通。它未必完全「正确」,因为DDD这个领域本身就没有唯一正确的实现方式。
这个专栏更像是一次技术交流。我把自己的做法和背后的思考过程写出来,你可以参考里面合理的部分,也可以对你觉得不对的地方提出质疑。碰撞和讨论往往比单方面输出更有价值。
专栏一共24篇,分7个模块。从第2篇开始就进入实战,介绍贯穿全专栏的业务系统。第3篇开始写代码。
专栏结构
24篇文章,分7个模块。从第2篇开始就进入实战,介绍贯穿全专栏的业务系统。第3篇开始写代码。
模块一:起点(2篇)
- 第1篇:开篇词
- 第2篇:我们要重构的系统:业务全貌
模块二:从表到聚合(6篇)
- 第3篇:从配货单表开始:什么是聚合根
- 第4篇:AggregateRoot基类的设计:用接口约束DDD规范
- 第5篇:配货单明细表:聚合内的子实体
- 第6篇:订货单号、金额、仓库编码:值对象的提炼
- 第7篇:配货单的发货与确认收货:聚合根的行为方法
- 第8篇:主表加明细表:Repository怎么存一个聚合
模块三:分层与读写分离(4篇)
- 第9篇:配货模块的代码怎么放:DDD分层结构
- 第10篇:配货单的查询与操作分离:CQRS
- 第11篇:依赖倒置与防腐层:配货模块调商品和库存
- 第12篇:从HTTP请求到数据库:对象转换的完整链路
模块四:服务与编排(3篇)
- 第13篇:按供应商拆单:领域服务的职责边界
- 第14篇:从订货到配货的完整流程:应用服务的编排
- 第15篇:两个入口共享同一段编排逻辑:应用层内复用
模块五:上下文与事件(4篇)
- 第16篇:统计模块为什么是独立的限界上下文
- 第17篇:DomainEvent抽象的设计:领域事件的基础设施
- 第18篇:订货单生成后触发统计:领域事件的实际使用
- 第19篇:回头看:系统中哪些是实体、哪些是值对象
模块六:落地(3篇)
- 第20篇:团队DDD开发规范的制定
- 第21篇:三年落地的踩坑与决策复盘
- 第22篇:什么场景该用DDD:适用性判断
模块七:架构思想(2篇)
- 第23篇:六边形架构:端口与适配器的设计思想
- 第24篇:整洁架构:以领域模型为中心的依赖规则
小结
DDD落地的难点从来不在理论,在于从理论到代码的那一步。概念记住了没用,得知道面对一张具体的业务表、一段具体的业务逻辑时,代码该怎么组织。这个专栏做的事情,就是把这一步写清楚。
最近在知乎出了「应付6000万会员的秒杀系统专栏」和「几亿用户,百万并发的C端商品系统实战」和「技术团队DDD领域驱动设计三年落地实战」专栏,感兴趣的可以订阅一下。至于知识星球的,可以搜:
- 老码头的技术浮生录
它是一个能实际帮你解决难题的星球。有问题的,找知心的Sam哥,支持无限次语音一对一解决你遇到的难题。「除了秒杀专栏,后续我新写的所有对外的付费专栏,在星球内都是免费的,且可以拿到所有源代码。」
我的知乎账号:
- SamDeepThinking