跳到主要内容

单体与微服务

单体架构为何仍是有效起点?​

  • 单体: 把主要业务能力作为一个部署单元交付,内部调用通常在同一进程内完成;
  • 收益: 开发、调试、监控和测试路径较短,使用单库事务也较直接;
  • 代价: 代码增长后可能耦合严重,局部修改通常需要整体部署,故障和资源竞争可能影响整个应用;
  • 扩展边界: 单体也可以多实例扩展,但难以只扩容其中一个独立业务部分;

模块化单体怎样控制内部复杂度?​

  • 模块化单体: 保持单一部署单元,同时按业务能力划分有明确接口的内部模块;
  • 关键要求: 模块通过约定接口交互,限制对其他模块内部数据和实现的直接访问;
  • 收益: 保留本地调用和简单部署,降低无序依赖,为将来有依据的拆分留下边界;
  • 限制: 只建立目录却允许任意跨模块访问,仍会退化成紧耦合单体;

微服务如何围绕业务能力独立交付?​

  • 微服务: 在明确业务上下文内承担聚焦责任的自主服务,拥有自己的实现、部署节奏和数据管理边界;
  • 限界上下文: 领域模型具有一致含义的业务范围,服务大小取决于责任而非代码行数;
  • 团队自治: 团队能够独立构建、测试、部署与扩容,减少跨团队同步发布;
  • 私有数据: 通过服务 API 获取其他领域能力,而不是直接依赖对方数据库表结构;
  • 收益: 针对热点独立扩容、隔离部分故障,并允许合理选择不同技术;
  • 代价: 网络延迟、分布式事务、跨服务测试、运维费用与可观测性要求显著增加;

如何识别分布式单体?​

  • 分布式单体: 表面分成多个服务,实际仍必须同步修改、发布或恢复,承担了分布式成本却缺少自治收益;
  • 典型信号: 共用表结构、循环同步调用、强制一起升级、一个服务失效拖垮完整请求链;
  • 边界判断: 单纯存在服务依赖或低延迟要求不足以证明它是分布式单体,关键是能否独立演进;
  • 设计措施: 按业务归属划界,减少共享可变模型,API 向后兼容,调用失败能隔离并有超时;
  • 重试要求: 涉及写操作时必须考虑幂等和中间状态,不能要求所有跨服务交互都立即具备全局 ACID;

SOA 与微服务的侧重点有什么不同?​

  • SOA: 面向服务架构强调通过标准服务接口复用企业能力;
  • 微服务: 更强调围绕业务责任的团队自治、独立部署和去中心化数据所有权;
  • 重叠: 两者可以共享服务化思想,不应仅凭是否使用某个消息总线判断类别;

什么时候拆成微服务才有价值?​

  • 判断依据: 共享代码库是否持续阻塞多个团队,业务边界是否成熟,独立扩容与发布是否能带来明确价值;
  • 成熟条件: 团队应能处理分布式故障、服务所有权、自动交付和跨服务追踪;
  • 演进原则: 先解决当前问题,再拆分已识别瓶颈,不因大型公司的架构外形相似就照搬;