2026-06-08 / 微服务 & DDD

微服务不是领域模型:先把 DDD 做对,再谈拆分

“微服务”经常被当成架构升级的终点,但它其实只是一个部署和组织方式。真正决定系统能不能长期演化的,不是你把服务拆成多少个,而是你是不是先把领域边界想清楚了。

微服务DDD领域建模

微服务不是领域模型:先把 DDD 做对,再谈拆分

“微服务”经常被当成架构升级的终点,但它其实只是一个部署和组织方式。真正决定系统能不能长期演化的,不是你把服务拆成多少个,而是你是不是先把领域边界想清楚了。

换句话说:

  • DDD 解决的是“系统该怎么理解业务”。
  • 微服务解决的是“系统该怎么部署和协作”。

两者相关,但不是一回事。

flowchart LR
    A["业务问题"] --> B["领域建模 / DDD"]
    B --> C["边界划分"]
    C --> D["服务拆分"]
    D --> E["独立部署"]

微服务到底是什么

从原始笔记里可以看出,微服务的关键特征是:

  • 一个大型系统拆成多个小服务。
  • 每个服务独立部署。
  • 服务之间通过 HTTP/TCP 等方式通信。
  • 每个服务围绕一类业务能力构建,并维护自己的数据和测试。

这意味着微服务不是“多几个项目”,而是系统组织方式的改变。

为什么“先做好 DDD 再谈微服务”

因为如果没有清晰的领域边界,拆服务很容易把单体系统里的混乱原样复制出去:

  • 一个服务里继续塞各种业务。
  • 服务之间频繁调用,最后变成分布式单体。
  • 数据边界不清楚,导致跨服务事务和强耦合越来越严重。

DDD 提供的是拆分前的“地图”:

  1. 统一语言告诉你团队在说什么。
  2. 聚合告诉你哪些对象必须一起变化。
  3. 限界上下文告诉你哪些规则不该混在一起。

有了这些,微服务拆分才有依据。

graph TD
    A["统一语言"] --> B["聚合"]
    B --> C["限界上下文"]
    C --> D["服务边界"]

微服务为什么容易失败

微服务失败通常不是因为技术栈,而是因为边界没有被正确抽象:

  • 拆得太细,调用链太长。
  • 拆得太早,组织和部署成本暴涨。
  • 数据拆分不清,最终还是跨库强耦合。

这也是为什么微服务看起来很现代,但如果 DDD 没打好底,系统反而会更难维护。

Service Fabric 代表了什么

原始笔记里提到 Service Fabric,它代表的是一种具体的微服务承载和编排平台思路。你可以把它理解为:当服务数量上来之后,光靠本地进程已经不够,需要有一套运行时平台去管理部署、扩缩容和故障恢复。

这类平台的出现,说明微服务的复杂度已经从“写代码”扩展到了“运行系统”。

一个更稳妥的拆分顺序

比起先切服务再补边界,更合理的顺序通常是:

  1. 先梳理业务语言。
  2. 找出限界上下文。
  3. 在上下文内部建立聚合和规则。
  4. 再把边界清晰的上下文拆成服务。
  5. 最后再考虑通信协议、容错和部署平台。
flowchart TD
    A["业务梳理"] --> B["上下文识别"]
    B --> C["聚合建模"]
    C --> D["服务拆分"]
    D --> E["通信与治理"]

实际开发场景

场景一:订单系统

如果订单、支付、库存、营销、物流都混在一起,微服务只会把耦合拆成网络调用。正确方式是先在 DDD 层里识别边界,再决定哪些上下文值得独立服务化。

场景二:团队协作

当不同团队负责不同上下文时,微服务才真正有价值。因为边界不仅是技术边界,也是组织边界。

场景三:演进路径

很多系统的合理路线不是“一上来微服务”,而是:

  • 单体 + 清晰 DDD
  • 边界清晰后再拆部分服务
  • 最后才演化成多服务协作

微服务和 DDD 的关系

可以简单总结成三句话:

  1. DDD 是认识业务的方式。
  2. 微服务是组织系统的方式。
  3. DDD 往往是微服务边界的来源。
sequenceDiagram
    participant Biz as 业务
    participant DDD as 领域建模
    participant Svc as 微服务
    Biz->>DDD: 业务规则与语言
    DDD->>Svc: 清晰边界与聚合
    Svc->>Biz: 可部署、可演进的实现

历史演进

  • 先是大单体和传统分层架构。
  • 然后人们发现复杂业务需要更强的领域建模。
  • 再后来,微服务成为部署和组织系统的常见方式。
  • 最后大家逐渐认识到:如果没有 DDD,微服务很容易只是把单体切碎。

最佳实践

  • 不要为了微服务而微服务。
  • 先做 DDD 边界梳理,再决定是否拆分。
  • 保持服务围绕业务能力,而不是围绕技术层。
  • 服务之间的通信、故障、重试、数据一致性都要提前考虑。
  • 如果一个服务里还是一堆无边界的 CRUD,那它只是换了个名字的单体。
微服务不是领域模型:先把 DDD 做对,再谈拆分 | Remi Resume