本文以《凤凰架构》阅读笔记为阅读入口,结合《凤凰架构》当前公开在线文档重新组织。它不是章节摘要,而是我认为最值得带回日常项目的几条判断标准。
很多架构讨论很像技术产品展览:Kubernetes、Service Mesh、事件驱动、DDD、Serverless 都被摆在台面上,却没有先回答业务规模、团队结构和失败成本。
读《凤凰架构》后,我最强烈的感受是:架构的价值不在于“用了更先进的东西”,而在于让团队能够承受当前复杂度,并为下一次变化留下空间。
架构不是技术栈,而是一组约束下的选择
同一个方案放进不同团队,结论可能完全相反。
一个五人团队维护六七个强耦合服务,通常没有获得独立交付的收益,却要承担网络故障、接口兼容、分布式追踪、多仓库发布和数据一致性的成本。反过来,一个数百人共同修改同一单体、任何发布都要全员协调的系统,也可能已经超过单体边界能够承受的组织复杂度。
所以架构评审不应先问“要不要微服务”,而应先写清楚:
- 一个需求通常会修改几个模块、由几个团队协作;
- 模块能否独立测试、发布和回滚;
- 数据所有权是否清晰;
- 故障需要隔离到什么范围;
- 团队是否具备监控、发布和故障处理能力;
- 引入新边界后,沟通成本究竟下降还是上升。
工具只是答案的一部分,组织和业务约束才是问题本身。
微服务边界的核心是独立交付
微服务不是把 Controller 按名词拆成多个仓库,也不是一个数据库表对应一个服务。一个有意义的服务边界至少应具备三种性质:
- 内聚:一组高频共同变化的业务规则留在一起;
- 自治:服务可以独立开发、验证、发布和恢复;
- 可理解:团队能够说清它拥有的数据、能力和对外契约。
如果一次业务变更总要同时修改五个服务、开五个 PR、等待固定顺序发布,那么只是把单体内部调用变成了远程调用。代码目录看起来更“分布式”,实际交付仍然是一个整体。
拆分前可以先做一次变更耦合分析:统计最近三个月的需求和故障,看看哪些模块总是一起改、哪些团队总要一起发布。真实变更历史通常比一张理想领域图更能暴露边界。
基础设施下沉,但业务语义不能一起下沉
把通用能力交给数据库、容器平台或网关,能减少应用中的重复样板。例如:
- 唯一约束交给数据库,避免并发下的 check-then-insert;
- 服务发现、健康检查和滚动发布交给编排平台;
- TLS 终止、基础鉴权和流量限制放到统一入口;
- 日志、指标和追踪通过平台约定采集。
不过“基础设施下沉”不能理解为把所有正确性都交给平台。库存不能为负、订单只能支付一次、退款必须经过审批,这些是业务不变量,仍应在领域代码、事务和数据约束中明确表达。
判断一项能力该放在哪里,可以问三个问题:
- 它是否与具体业务语义无关;
- 平台实现是否比每个应用重复实现更可靠;
- 下沉后是否仍能被测试、观察和局部覆盖。
如果答案不清楚,先保留在应用边界内,等语义稳定后再平台化。过早下沉会把一次局部需求变成全平台升级。
演进不是持续加层,而是允许替换
系统会随着需求、人员和规模变化而老化,这并不证明最初设计失败。一个简单单体如果帮助产品验证了市场、让团队建立了领域认识,它已经完成了当前阶段的使命。
真正危险的是假设现有结构必须永远保留,于是每次变化只能继续加适配层、同步任务和例外配置。久而久之,所有人都知道结构不合理,却没人敢动。
演进式架构需要给每个阶段性方案写出退出条件:
当前方案解决什么问题:
可以承受的规模与团队边界:
已知限制:
需要持续观察的指标:
触发重新设计的条件:
数据和调用方怎样迁移:
失败时怎样回退:
例如“当前先使用单库”不是欠债声明。只要同时明确容量假设、热点指标、备份恢复和未来分区键候选,它就是一个有边界的工程决策。
大规模重写不是演进的默认方式
接受系统可替换,不等于轻易宣布全面重写。大爆炸式重写经常同时失去三样东西:旧系统里没写下来的业务规则、真实流量验证,以及随时回滚的能力。
更稳妥的迁移通常包含:
- 先建立可观测基线,知道旧系统当前表现;
- 在旧边界外建立新接口或防腐层;
- 选择一条低风险、可独立验证的路径切流;
- 新旧实现并行对比结果;
- 小比例流量开始,保留快速回退;
- 数据迁移有校验、补偿和最终完成条件;
- 确认没有调用方后再删除旧路径。
演进的本质是控制变化风险,而不是让新旧两套系统永久共存。每一层兼容代码都应有负责人和删除日期。
复杂度像预算,不是越少越好
微服务、消息队列、缓存和容器平台都会引入复杂度,但它们也可能解决真实问题。关键不是追求“零复杂度”,而是判断新增复杂度是否买到了可量化收益。
可以把每次架构升级写成一份复杂度预算:
| 新增机制 | 希望购买的收益 | 新的失败模式 | 谁负责 |
|---|---|---|---|
| 消息队列 | 削峰、异步解耦 | 重复、乱序、积压 | 业务团队 + 平台 |
| 服务拆分 | 独立发布、故障隔离 | 网络、契约、分布式一致性 | 服务所有者 |
| Kubernetes | 标准化调度与发布 | 集群、网络、权限复杂度 | 平台团队 |
如果收益只是“看起来更现代”,而新的失败模式没人负责,这笔预算就不应批准。
读书笔记的价值在于暴露自己的未知
《凤凰架构》公开在线文档本身就是一个很好的示范:写作不是学习完成后的附属动作,而是检验理解的过程。
目录式摘抄只能证明“看过”。真正有用的读书输出至少要完成一次转换:
- 把书中的概念换成自己项目里的例子;
- 写出同意和不同意的部分;
- 找一个过去的决策,用新框架重新评审;
- 给出下次可以直接使用的检查表;
- 标注结论依赖的前提,避免把阶段性经验写成定律。
当一段话无法脱离原书复述,往往说明它还没有进入自己的知识结构。
一份架构演进评审表
当前业务阶段和最重要目标:
团队数量、所有权和发布方式:
最频繁的变更路径:
当前最昂贵的故障模式:
准备引入的架构机制:
它购买的可量化收益:
它新增的失败模式和维护成本:
不改变架构还能怎样解决:
渐进迁移、验证和回滚方式:
重新评审与删除旧路径的条件:
如果一个方案无法回答这些问题,就还只是技术偏好,不是架构决策。