从单体到微服务:一条可落地的迁移路线

3 阅读2分钟

微服务不是目标,而是手段。

很多团队“先拆再说”,结果是:服务变多了,发布更慢了,故障更难查了。

本文给出一条更稳的路径:先识别瓶颈,再按业务边界拆分,再分阶段迁移


【场景:单体系统出现三类瓶颈】

典型信号:

  1. 一个小需求需要多人改同一仓库,冲突频繁。
  2. 任意模块故障都可能拖垮全站。
  3. 发布窗口越来越长,回滚成本越来越高。

当这些问题持续出现,才说明“值得拆”。


【第1步:先做领域边界,不要按技术层拆】

错误拆法:按 controller/service/repository 拆成多个服务。

推荐拆法:按业务能力拆分(订单域、库存域、支付域)。

判定原则:

  • 数据是否天然聚合在一起
  • 变更是否经常一起发生
  • 团队是否可独立交付

【第2步:优先拆“低风险高收益”模块】

先从这类模块开始:

  • 读多写少
  • 与核心交易链路耦合较低
  • 接口边界清晰

不建议第一刀就拆订单核心链路。


【第3步:建立“防腐层”而不是直接互调】

单体与新服务并存阶段,避免直接数据库互查。

建议:

  • 通过 API 或消息契约交互
  • 建立 anti-corruption layer 屏蔽旧模型
public OrderDTO queryOrder(Long orderId) {
   LegacyOrder legacy = legacyClient.get(orderId);
   return mapper.toOrderDTO(legacy);
}

【第4步:数据迁移采用“双写 + 校验 + 切流”】

典型流程:

  1. 新库建表,旧链路继续提供服务。
  2. 双写一段时间,校验一致性。
  3. 按比例切流到新服务。
  4. 观察稳定后完成下线。
transaction.execute(() -> {
   oldRepo.save(order);
   newRepo.save(order);
});

【第5步:先补基础设施,再放大拆分】

微服务落地前,至少先有:

  • 配置中心
  • 服务注册发现
  • 链路追踪
  • 统一日志与告警
  • 灰度发布能力

没有这些,拆分只会把单体问题分散到更多节点。


【迁移节奏建议】

  • 阶段1:单体内模块化(先降耦)
  • 阶段2:拆 1~2 个边缘服务
  • 阶段3:核心链路分域拆分
  • 阶段4:治理优化(容量、弹性、成本)

目标是“连续可交付”,不是“一次性重构”。


【迁移检查清单】

  1. 是否明确“为什么拆”,而不是“为了拆”?
  2. 领域边界是否按业务语义划分?
  3. 是否有防腐层避免旧模型污染新服务?
  4. 数据迁移是否有双写与一致性校验?
  5. 是否具备可观测与灰度发布能力?
  6. 是否定义了回滚路径与应急预案?

下期预告:

《可观测性落地:日志、指标、链路追踪怎么统一》