DDD 领域驱动设计 与 传统的微服务拆分又有什么不同
你这句话非常真实,而且是好事。
我先说结论,再慢慢“拆你心里的结”。
你没懂,不是你理解力问题,是 DDD 经常被人讲反了。
我们完全抛开术语,用你熟悉的方式来讲。
一句话先定调(你先记住)
微服务 = 按“技术/功能”拆系统
DDD = 按“业务认知”拆系统
很多人是先微服务、再强行套 DDD,结果必炸。
一、传统微服务拆分:你一定干过
典型拆法(真实项目)
user-service
order-service
product-service
pay-service
或者更技术一点:
auth-service
config-service
log-service
这种拆法的本质是什么?
👉 按“功能职责”拆
优点:
- 快
- 好理解
- 技术团队好分工
缺点(你一定遇到过):
- 一个需求要改 3~5 个服务
- 状态到处飞
- 强依赖 RPC
- Service 之间互相“教对方做业务”
举个扎心的例子:
取消订单
- order-service 改状态
- pay-service 判断能不能退款
- stock-service 回滚库存
- coupon-service 回滚优惠券
👉 结果:业务逻辑被拆碎了
二、DDD 是怎么拆的?(核心区别来了)
DDD 根本不关心你是不是微服务。
它先问一个问题:
“业务上,这是不是一件完整的事?”
同样是“订单”,DDD 会这么想:
- 下单
- 支付
- 取消
- 退款
这些是不是同一个业务生命周期?
如果是 → 就不该被拆散
三、一个对你“有冲击力”的对比例子
❶ 传统微服务视角(技术拆)
order-service
pay-service
stock-service
coupon-service
逻辑写成这样:
orderService.cancel();
payService.refund();
stockService.rollback();
couponService.rollback();
📌 特点:
- 逻辑在“调度层”
- 任何一个失败,全链路复杂
- 代码像流程图,不像业务
❷ DDD 视角(领域拆)
DDD 会说:
“取消订单”是一个业务动作,不是 4 个系统的拼装”
于是模型会变成:
交易域(Order Domain)
└── Order(聚合根)
├── cancel()
├── refund()
├── rollbackStock()
你代码会变成:
order.cancel();
内部:
- 校验状态
- 发布领域事件
- 决定后续行为
👉 “谁的业务,谁负责”
四、你真正没懂的点,其实是这个
DDD 不等于“更多拆分”,而是“少拆 + 拆对”
传统微服务的错觉:
- 拆得越细 → 越先进
- RPC 就是解耦
DDD 的认知:
- 拆错边界,比不拆更可怕
- 网络不是解耦,是“放大耦合”
五、微服务 vs DDD 的本质差异表
| 维度 | 传统微服务 | DDD |
|---|---|---|
| 拆分依据 | 技术/功能 | 业务语义 |
| 是否关注业务语言 | 不关心 | 极度关心 |
| Service 之间 | 强协作 | 弱协作 |
| 业务逻辑位置 | 调度层 | 领域模型 |
| 改一个需求 | 多服务联动 | 限定在一个上下文 |
六、那是不是“DDD = 不要微服务”?
❌ 不是
正确关系是:
DDD 决定“该不该拆”
微服务只是“部署形态”
你可以:
- 一个 DDD 上下文 = 一个微服务
- 也可以:一个上下文先单体
DDD 不强迫你上微服务。
七、我用一句你能“恍然大悟”的话收尾
传统微服务:把“人怎么分工”当成系统设计
DDD:把“业务本身怎么运作”当成系统设计
你之前觉得“没懂”,是因为:
- 你看到的是“名词”
- DDD 真正关心的是:
👉 业务是不是被拆散了
浙公网安备 33010602011771号