2026-06-08 / 微服务 & DDD
微服务不是领域模型:先把 DDD 做对,再谈拆分
“微服务”经常被当成架构升级的终点,但它其实只是一个部署和组织方式。真正决定系统能不能长期演化的,不是你把服务拆成多少个,而是你是不是先把领域边界想清楚了。
微服务DDD领域建模
微服务不是领域模型:先把 DDD 做对,再谈拆分
“微服务”经常被当成架构升级的终点,但它其实只是一个部署和组织方式。真正决定系统能不能长期演化的,不是你把服务拆成多少个,而是你是不是先把领域边界想清楚了。
换句话说:
- DDD 解决的是“系统该怎么理解业务”。
- 微服务解决的是“系统该怎么部署和协作”。
两者相关,但不是一回事。
flowchart LR
A["业务问题"] --> B["领域建模 / DDD"]
B --> C["边界划分"]
C --> D["服务拆分"]
D --> E["独立部署"]
微服务到底是什么
从原始笔记里可以看出,微服务的关键特征是:
- 一个大型系统拆成多个小服务。
- 每个服务独立部署。
- 服务之间通过 HTTP/TCP 等方式通信。
- 每个服务围绕一类业务能力构建,并维护自己的数据和测试。
这意味着微服务不是“多几个项目”,而是系统组织方式的改变。
为什么“先做好 DDD 再谈微服务”
因为如果没有清晰的领域边界,拆服务很容易把单体系统里的混乱原样复制出去:
- 一个服务里继续塞各种业务。
- 服务之间频繁调用,最后变成分布式单体。
- 数据边界不清楚,导致跨服务事务和强耦合越来越严重。
DDD 提供的是拆分前的“地图”:
- 统一语言告诉你团队在说什么。
- 聚合告诉你哪些对象必须一起变化。
- 限界上下文告诉你哪些规则不该混在一起。
有了这些,微服务拆分才有依据。
graph TD
A["统一语言"] --> B["聚合"]
B --> C["限界上下文"]
C --> D["服务边界"]
微服务为什么容易失败
微服务失败通常不是因为技术栈,而是因为边界没有被正确抽象:
- 拆得太细,调用链太长。
- 拆得太早,组织和部署成本暴涨。
- 数据拆分不清,最终还是跨库强耦合。
这也是为什么微服务看起来很现代,但如果 DDD 没打好底,系统反而会更难维护。
Service Fabric 代表了什么
原始笔记里提到 Service Fabric,它代表的是一种具体的微服务承载和编排平台思路。你可以把它理解为:当服务数量上来之后,光靠本地进程已经不够,需要有一套运行时平台去管理部署、扩缩容和故障恢复。
这类平台的出现,说明微服务的复杂度已经从“写代码”扩展到了“运行系统”。
一个更稳妥的拆分顺序
比起先切服务再补边界,更合理的顺序通常是:
- 先梳理业务语言。
- 找出限界上下文。
- 在上下文内部建立聚合和规则。
- 再把边界清晰的上下文拆成服务。
- 最后再考虑通信协议、容错和部署平台。
flowchart TD
A["业务梳理"] --> B["上下文识别"]
B --> C["聚合建模"]
C --> D["服务拆分"]
D --> E["通信与治理"]
实际开发场景
场景一:订单系统
如果订单、支付、库存、营销、物流都混在一起,微服务只会把耦合拆成网络调用。正确方式是先在 DDD 层里识别边界,再决定哪些上下文值得独立服务化。
场景二:团队协作
当不同团队负责不同上下文时,微服务才真正有价值。因为边界不仅是技术边界,也是组织边界。
场景三:演进路径
很多系统的合理路线不是“一上来微服务”,而是:
- 单体 + 清晰 DDD
- 边界清晰后再拆部分服务
- 最后才演化成多服务协作
微服务和 DDD 的关系
可以简单总结成三句话:
- DDD 是认识业务的方式。
- 微服务是组织系统的方式。
- DDD 往往是微服务边界的来源。
sequenceDiagram
participant Biz as 业务
participant DDD as 领域建模
participant Svc as 微服务
Biz->>DDD: 业务规则与语言
DDD->>Svc: 清晰边界与聚合
Svc->>Biz: 可部署、可演进的实现
历史演进
- 先是大单体和传统分层架构。
- 然后人们发现复杂业务需要更强的领域建模。
- 再后来,微服务成为部署和组织系统的常见方式。
- 最后大家逐渐认识到:如果没有 DDD,微服务很容易只是把单体切碎。
最佳实践
- 不要为了微服务而微服务。
- 先做 DDD 边界梳理,再决定是否拆分。
- 保持服务围绕业务能力,而不是围绕技术层。
- 服务之间的通信、故障、重试、数据一致性都要提前考虑。
- 如果一个服务里还是一堆无边界的 CRUD,那它只是换了个名字的单体。