服务边界与拆分¶
服务边界首先是业务边界,不是按 Controller、Service、DAO 技术层拆分。订单、库存、支付等服务应能表达独立业务能力,而不是形成只能互相调用才能完成任何工作的“分布式单体”。
判断一个边界¶
| 问题 | 说明 |
|---|---|
| 谁拥有这份数据 | 一个核心业务实体应有明确写入方,其他服务通过 API/事件使用 |
| 是否能独立发布 | 修改内部实现不应要求所有消费者同时升级 |
| 失败是否可隔离 | 非核心服务故障不应拖垮主交易链 |
| 扩容特征是否不同 | 计算密集、读热点、批处理可有不同扩容策略 |
| 团队是否真正负责 | 负责代码、运行、告警、容量和恢复,而不只是开发 |
推荐拆分过程¶
不要一次重写整个系统。先建立调用量、错误率、数据库依赖和发布关系基线,再选择耦合较低或扩容收益明显的模块。
数据所有权¶
理想情况下,每个服务拥有自己的数据模型和写入入口。共享同一批表会导致:
- 一个服务改表破坏其他服务。
- 绕过 API 后无法执行业务校验和审计。
- 服务无法独立扩缩容、迁移或回滚。
- 故障和锁竞争跨服务扩散。
“每服务独立数据库”表达的是所有权边界,不要求每个服务都部署一套物理数据库。可以共享数据库集群,但账号、Schema、权限和变更责任必须清楚。
常见错误¶
| 错误 | 结果 |
|---|---|
| 按技术层拆成用户 API、用户逻辑、用户数据库服务 | 每次请求跨多次网络,无法独立演进 |
| 服务过细 | 调用链过长、部署对象爆炸、排障困难 |
| 多个服务直接写同一张表 | 所有权和一致性失控 |
| 共享公共代码包含大量业务逻辑 | 升级仍要求所有服务同步发布 |
| 只拆应用不拆团队职责 | 出故障时没有端到端负责人 |
拆分验收¶
- 输入、输出、错误码和版本策略是否明确。
- 数据由谁写、谁读、怎样迁移是否明确。
- 下游不可用时服务怎样降级。
- 是否有独立构建、部署、回滚和监控。
- 是否能在测试环境做契约和故障测试。
- 拆分后是否真的降低耦合或获得独立扩容收益。