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
相关推荐
红尘散仙30 分钟前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记2 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
_codemonster2 小时前
30分钟快速搭建 Spring Cloud Alibaba 微服务实战(一)
微服务·架构·毕业设计·课程设计
会编程的土豆2 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
Cosolar2 小时前
从零写一个 Attention Is All You Need
人工智能·面试·架构
喵个咪2 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6163 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364573 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao3 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
qcx234 小时前
【系统学AI】09 Multi-Agent架构(2026版):从学术理论到工业级实践
java·人工智能·架构·multi-agent·claude agent