主题
DDD 领域驱动设计 · 导读
一句话:DDD(Domain-Driven Design)用「边界 + 模型」承接业务复杂度:先把业务切成可以独立演进的限界上下文,再把每个边界内的规则放进聚合。它换来的是模型和团队的可维护性,代价是前期建模投入和跨边界的一致性设计。
这套文档只讲机制、产出物和落地动作,不按题库组织。示例以 Java 17+ 编写,框架示例标注 Spring Boot 3.x。
读之前需要什么
| 前置能力 | 具体检查 | 不满足时先补 |
|---|---|---|
| 面向对象 | 能说清封装、多态、组合优于继承 | Java 基础语法 |
| 业务系统经验 | 见过 Service 膨胀、改一处崩一片 | 先读一个真实项目的分层代码 |
| Java 17 | 能读 record、Optional、Stream | Java 8–17 新特性 |
| 测试 | 能跑 JUnit 5,理解断言与夹具 | JUnit 5 用户指南 |
| 数据库 | 理解本地事务、唯一索引、乐观锁 | MySQL 事务与锁 |
不需要先学微服务。限界上下文是逻辑边界,和部署单元是两件事,05 篇再讨论落地。
阅读顺序
| 顺序 | 文档 | 回答的问题 | 读完应产出 | 前置 |
|---|---|---|---|---|
| 1 | 01-战略设计 | 业务怎么切、边界从哪来、上下文怎么协作 | 一页上下文画布 + 一张映射表 | 无 |
| 2 | 03-建模方法 | 怎么从业务事实推导模型,而不是照表建类 | 一条事件时间轴 + 术语表初稿 | 01 |
| 3 | 02-战术设计 | 实体、值对象、聚合、仓储、领域服务、领域事件各装什么 | 一个带不变量和乐观锁的聚合 + 测试 | 01、03 |
| 4 | 04-工程落地 | 依赖方向怎么画、CQRS 和事件溯源何时用 | 包结构 + 一条 ArchUnit 规则 | 02 |
| 5 | 05-DDD与微服务 | 上下文怎么落到服务和库、跨边界一致性怎么做 | 库隔离决策表 + Outbox 链路 | 02、04 |
| 6 | 06-生产踩坑 | 落地变形长什么样、怎么用证据定位 | 一份团队自查记录 | 01–05 |
| 7 | 99-生产检查清单 | 上线前、运行中、故障时各查什么 | 勾选后的清单 | 全部 |
建议节奏:第 1 周读 01、03,完成一次 2 小时事件风暴;第 2 周读 02、04,把聚合和依赖规则跑通;第 3 周读 05、06,用一个真实跨边界流程做 Outbox 验证。
验收标准
读完不等于学会。下面每一条都能用命令或产物验证:
| 验收项 | 判据 |
|---|---|
| 边界说得清 | 能指出每个限界上下文的 owner、模型、数据归属;同一术语在两个上下文有不同定义时,能说出翻译发生在哪 |
| 聚合守得住 | mvn -q test -Dtest=OrderAggregateTest 通过;重复支付、空订单支付、超量添加都抛异常 |
| 并发有方案 | 仓储 UPDATE ... WHERE version = ? 影响行数为 0 时抛乐观锁异常;重试次数和退避策略写进代码 |
| 依赖没走反 | ArchUnit 规则通过:domain 包不依赖 Spring、MyBatis、infrastructure、adapter |
| 事件不丢 | 状态变更与 Outbox 写入在同一本地事务;中继任务能查到未发送记录并补发 |
| 坑能定位 | 面对「锁等待」「事件积压」「模型漂移」,能给出证据查询和判断阈值,而不是只给结论 |
目录结构
text
28_DDD领域驱动设计/
├── 00-DDD学习路线.md ← 本页,只做导航
├── 01-战略设计.md ← 子域、限界上下文、上下文映射
├── 02-战术设计.md ← 六类构件、聚合不变量、并发
├── 03-建模方法.md ← 事件风暴、统一语言、规格模式
├── 04-工程落地.md ← 分层、六边形、CQRS、事件溯源
├── 05-DDD与微服务.md ← 服务拆分、库隔离、最终一致性
├── 06-DDD生产踩坑.md ← 现象、证据、根因、处置
└── 99-生产检查清单.md ← 可勾选的执行清单与其他主题的衔接
- 聚合的锁与事务:MySQL 事务与锁
- 仓储实现:MyBatis 核心原理、Spring 事务管理
- 跨上下文最终一致性:分布式事务、幂等性设计
- 需求到规范的写法:SDD 与 SPEC 规范驱动开发
初稿 2026-10 | 最后修订 2026-10