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 真正关心的是:
    👉 业务是不是被拆散了
posted @ 2025-12-25 15:31  中登程序猿  阅读(0)  评论(0)    收藏  举报