DDD领域驱动设计三年落地实战-开篇词

「提醒」:是付费专栏,但是在知识星球里是免费的。目前星球里已更新了「几亿用户,百万并发的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
相关推荐
小小小前端啊1 小时前
前端工程化与性能优化指南
架构
ZJY1321 小时前
1-1:搭建项目框架
架构
C137的本贾尼1 小时前
入主城堡:LangChain 核心架构与快速上手
架构·langchain
DeepNoMind1 小时前
从入门到 Offer:系统设计面试的完整备考路线
后端
阿丰资源2 小时前
基于Springboot+mysql的在线兼职平台(附源码)
spring boot·后端·mysql
一切皆是因缘际会2 小时前
2026年AGI突围:自主智能体驱动,数字生命从架构落地到自我迭代全解析
人工智能·深度学习·机器学习·架构·系统架构·agi
2601_957780843 小时前
GPT-5.5时代:从“指令集“到“任务契约“的Prompt工程范式迁移
大数据·人工智能·gpt·架构·prompt
网络点点滴3 小时前
简述Node.js运行时核心架构
架构·node.js
小村儿3 小时前
连载
前端·后端·ai编程