本节摘要:微服务架构在经历了十年的狂热追捧后,2026 年正在回归理性。"无脑拆微服务"的教训让很多团队付出了高昂代价——分布式事务、服务间通信、运维复杂度、调试困难。"模块化单体"(Modular Monolith)成为新的共识:先用模块化单体把业务逻辑理清楚,只在真正需要独立扩展和独立部署的边界才拆成微服务。
阅读完本节,你应当能够:
一个创业公司,3 个开发者,日活 1000。CTO 说:"我们用微服务吧,以后好扩展。"于是他们搭了 8 个服务、3 个消息队列、2 个 API 网关、1 个 K8s 集群。
三个月后,三个开发者疲于维护 8 个服务的部署、监控和调试。"以后好扩展"的"以后"还没来,"现在很痛苦"的"现在"已经在了。
这个故事在 2018-2023 年反复上演。到 2026 年,行业终于形成了一个共识:架构决策应该基于当前规模,而不是假想的未来规模。
| 维度 | 单体 | 模块化单体 | 微服务 |
|---|---|---|---|
| 部署 | 一个包 | 一个包 | 多个独立服务 |
| 数据库 | 共享 | 逻辑隔离(Schema 分离) | 每个服务独立数据库 |
| 通信 | 函数调用 | 模块间接口调用 | 网络调用(HTTP/gRPC/消息) |
| 扩展 | 整体扩展 | 整体扩展 | 按服务独立扩展 |
| 团队适配 | 小团队 | 中小团队 | 中大团队(每个团队负责几个服务) |
| 调试 | 简单 | 简单 | 复杂(需要分布式追踪) |
| 技术栈 | 统一 | 统一 | 可以每服务不同 |
模块化单体不是"把代码随便放几个文件夹"。它要求:
| 信号 | 说明 |
|---|---|
| 团队超过 20 人 | 多个团队需要独立迭代 |
| 某个功能需要独立扩展 | 比如搜索服务需要 10 倍于其他服务的计算资源 |
| 某个功能需要独立部署 | 频繁更新的功能不应该影响稳定功能 |
| 技术栈需要异构 | 某个模块需要不同语言或运行时 |
💡 关键直觉:拆微服务的理由应该是"组织需要"(团队独立)或"扩展需要"(资源异构),而不是"技术纯粹"。如果你的团队只有 5 个人,模块化单体几乎总是更好的选择。
阶段1:单体(0-5人,验证产品) ↓ 团队增长,某个模块需要独立扩展 阶段2:模块化单体(5-15人,理清边界) ↓ 某个模块确实需要独立部署和扩展 阶段3:选择性微服务(15+人,关键服务拆出) ↓ 继续增长 阶段4:全面微服务(如果确实需要)
⚠️ 常见坑:不要从阶段1直接跳到阶段4。每一步都有学习成本,跳过中间步骤意味着同时面对多个新挑战。
| 反模式 | 问题 | 正确做法 |
|---|---|---|
| 分布式单体 | 服务间强耦合,改一个要改所有 | 服务间松耦合,通过事件通信 |
| 共享数据库 | 数据一致性靠分布式事务 | 每个服务独立数据库 |
| 没有 API 网关 | 客户端直接调用多个服务 | 统一入口,路由 + 鉴权 |
| 没有分布式追踪 | 出了问题不知道在哪个服务 | 引入 OpenTelemetry |
| 过度拆分 | 10 个服务 3 个人维护 | 按业务域拆分,不按技术层 |
全栈与微服务讲完了。下一章进入数据工程与区块链领域。