<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>架构演进 on 文艺技术笔记</title><link>https://wenyiblog.top/tags/%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B/</link><description>Recent content in 架构演进 on 文艺技术笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>文艺技术笔记 | 软件工程师文艺</copyright><lastBuildDate>Wed, 08 Jul 2026 18:10:00 +0800</lastBuildDate><atom:link href="https://wenyiblog.top/tags/%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B/index.xml" rel="self" type="application/rss+xml"/><item><title>架构决策的反模式：什么时候你不该拆微服务？</title><link>https://wenyiblog.top/2026/07/when-not-to-split-microservices/</link><pubDate>Wed, 08 Jul 2026 18:10:00 +0800</pubDate><guid>https://wenyiblog.top/2026/07/when-not-to-split-microservices/</guid><description>&lt;p&gt;微服务被神化了。过去十年，它从一种架构选项变成了&amp;quot;政治正确&amp;quot;——不拆就是落后，不拆就是技术债。&lt;/p&gt;
&lt;p&gt;但现实是，&lt;strong&gt;70% 的微服务迁移项目最终都陷入了&amp;quot;分布式单体&amp;quot;的泥潭&lt;/strong&gt;。不是微服务不好，而是大多数团队根本没想清楚自己为什么要拆。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;架构决策的核心从来不是&amp;quot;什么技术更先进&amp;quot;，而是&amp;quot;什么问题更痛&amp;quot;。如果你连痛点在哪都没搞清楚，拆微服务只会制造更多痛点。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这篇文章不打算再讲微服务有多好——那些内容你已经看过一万遍了。我想聊的是另一面：&lt;strong&gt;什么时候你根本不该拆&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="团队不到-30-人别折腾了"&gt;&lt;a href="#%e5%9b%a2%e9%98%9f%e4%b8%8d%e5%88%b0-30-%e4%ba%ba%e5%88%ab%e6%8a%98%e8%85%be%e4%ba%86" class="header-anchor"&gt;&lt;/a&gt;团队不到 30 人？别折腾了
&lt;/h2&gt;&lt;p&gt;微服务的本质是组织边界的映射。康威定律说得直白：系统架构会趋向于组织的沟通结构。&lt;/p&gt;
&lt;p&gt;但这话反过来也成立：&lt;strong&gt;如果你的组织根本没有清晰的边界，强行拆微服务只会制造混乱。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个 10 人的开发团队，所有人坐在一起，中午一起吃饭，遇到问题吼一声就能解决。这种沟通效率，任何 RPC 调用都比不上。&lt;/p&gt;
&lt;p&gt;拆成微服务后呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务 A 的接口改了，得通知服务 B 的负责人&lt;/li&gt;
&lt;li&gt;服务 B 的负责人正在修服务 C 的 Bug，没空看&lt;/li&gt;
&lt;li&gt;服务 C 的部署流水线挂了，没人知道怎么修&lt;/li&gt;
&lt;li&gt;一个需求要改三个服务，发版得协调三个人的时间&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;沟通成本从 O(1) 变成了 O(n²)&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我见过一个 8 人团队，把电商系统拆成了 23 个微服务。结果每次上线都要开全员会议，一个接口变更要发五封邮件，最后大家干脆建了个群，所有变更都在群里吼。&lt;/p&gt;
&lt;p&gt;这不叫微服务，这叫&lt;strong&gt;用分布式架构模拟单体架构&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;团队规模&lt;/th&gt;
&lt;th&gt;推荐架构&lt;/th&gt;
&lt;th&gt;理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; 10 人&lt;/td&gt;
&lt;td&gt;单体&lt;/td&gt;
&lt;td&gt;沟通成本最低，迭代最快&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-30 人&lt;/td&gt;
&lt;td&gt;模块化单体&lt;/td&gt;
&lt;td&gt;代码边界清晰，部署仍是一体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30-100 人&lt;/td&gt;
&lt;td&gt;粗粒度微服务&lt;/td&gt;
&lt;td&gt;按业务域拆分，3-5 个服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 100 人&lt;/td&gt;
&lt;td&gt;细粒度微服务&lt;/td&gt;
&lt;td&gt;团队自治，独立演进&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;团队规模是架构决策的第一个约束条件&lt;/strong&gt;。如果你的团队还在&amp;quot;一个披萨能喂饱&amp;quot;的阶段，老老实实写单体。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="业务域还没稳定拆了也是白拆"&gt;&lt;a href="#%e4%b8%9a%e5%8a%a1%e5%9f%9f%e8%bf%98%e6%b2%a1%e7%a8%b3%e5%ae%9a%e6%8b%86%e4%ba%86%e4%b9%9f%e6%98%af%e7%99%bd%e6%8b%86" class="header-anchor"&gt;&lt;/a&gt;业务域还没稳定？拆了也是白拆
&lt;/h2&gt;&lt;p&gt;微服务拆分的黄金法则是&amp;quot;按业务边界拆&amp;quot;。DDD（领域驱动设计）里叫限界上下文（Bounded Context）。&lt;/p&gt;
&lt;p&gt;听起来很美。问题是：&lt;strong&gt;大多数创业公司的业务边界根本还没稳定&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;你今天觉得&amp;quot;用户&amp;quot;和&amp;quot;订单&amp;quot;是两个独立域，明天产品经理说要在用户页展示订单统计，后天运营说要给用户打标签关联订单行为。三个需求下来，你的&amp;quot;独立服务&amp;quot;已经耦合得比单体还紧。&lt;/p&gt;
&lt;p&gt;有个做 SaaS 的团队，早期按&amp;quot;用户服务&amp;quot;&amp;ldquo;订单服务&amp;quot;&amp;ldquo;支付服务&amp;quot;拆了三个微服务。业务跑了半年，发现真正的边界应该是&amp;quot;前台展示&amp;quot;和&amp;quot;后台运营&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;结果呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户服务里塞了一堆运营逻辑&lt;/li&gt;
&lt;li&gt;订单服务要调用户服务拿标签，又要调支付服务查账单&lt;/li&gt;
&lt;li&gt;三个服务之间的调用关系比意大利面还乱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后他们做了一件&amp;quot;政治不正确&amp;quot;的事：&lt;strong&gt;把三个服务合并回一个单体，按模块划分代码边界&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;两年后业务稳定了，再把&amp;quot;支付&amp;quot;和&amp;quot;通知&amp;quot;拆出去。这次拆分顺理成章，因为边界已经用脚投票投出来了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;业务不确定性高的时候，单体的&amp;quot;改起来快&amp;quot;比微服务的&amp;quot;部署独立&amp;quot;重要一万倍。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="数据一致性要求高分布式事务会让你哭"&gt;&lt;a href="#%e6%95%b0%e6%8d%ae%e4%b8%80%e8%87%b4%e6%80%a7%e8%a6%81%e6%b1%82%e9%ab%98%e5%88%86%e5%b8%83%e5%bc%8f%e4%ba%8b%e5%8a%a1%e4%bc%9a%e8%ae%a9%e4%bd%a0%e5%93%ad" class="header-anchor"&gt;&lt;/a&gt;数据一致性要求高？分布式事务会让你哭
&lt;/h2&gt;&lt;p&gt;微服务最被低估的成本是&lt;strong&gt;数据一致性&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;单体架构里，一个事务就能搞定跨表更新。订单状态改了，库存扣了，用户积分加了——一个 &lt;code&gt;COMMIT&lt;/code&gt; 完事。&lt;/p&gt;
&lt;p&gt;拆成微服务后，这三步分布在三个数据库里。你要保证它们要么都成功，要么都回滚，就得引入分布式事务。&lt;/p&gt;
&lt;p&gt;分布式事务的方案无非几种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;两阶段提交（2PC）&lt;/strong&gt;：性能差，锁资源时间长，数据库不一定支持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCC（Try-Confirm-Cancel）&lt;/strong&gt;：代码复杂度翻倍，每个业务逻辑要写三遍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saga 模式&lt;/strong&gt;：长事务编排，补偿逻辑难写，中间状态对外可见&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终一致性&lt;/strong&gt;：接受短暂不一致，用消息队列异步对齐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每种方案都有代价。选哪种，取决于你能容忍哪种不一致。&lt;/p&gt;
&lt;p&gt;有个做金融的团队，把账户系统拆成了&amp;quot;账户服务&amp;quot;&amp;ldquo;交易服务&amp;quot;&amp;ldquo;风控服务&amp;rdquo;。一笔转账要跨三个服务，他们选了 Saga 模式。&lt;/p&gt;
&lt;p&gt;结果上线第一周就出事了：交易服务扣了钱，风控服务判定异常要回滚，但回滚消息丢了。用户的钱少了，订单却没生成。&lt;/p&gt;
&lt;p&gt;排查了三天，最后发现是消息队列的一个分区挂了，回滚消息进了死信队列没人消费。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;分布式系统的 Bug 比单体系统难排查 10 倍&lt;/strong&gt;。不是因为代码更复杂，而是因为状态分散在多个节点，日志分散在多个系统，时序问题靠人脑根本理不清。&lt;/p&gt;
&lt;p&gt;如果你的业务对数据一致性要求极高（金融、库存、支付），又没有成熟的基础设施团队，&lt;strong&gt;单体架构是更安全的选择&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="运维能力不够微服务会把运维成本放大-10-倍"&gt;&lt;a href="#%e8%bf%90%e7%bb%b4%e8%83%bd%e5%8a%9b%e4%b8%8d%e5%a4%9f%e5%be%ae%e6%9c%8d%e5%8a%a1%e4%bc%9a%e6%8a%8a%e8%bf%90%e7%bb%b4%e6%88%90%e6%9c%ac%e6%94%be%e5%a4%a7-10-%e5%80%8d" class="header-anchor"&gt;&lt;/a&gt;运维能力不够？微服务会把运维成本放大 10 倍
&lt;/h2&gt;&lt;p&gt;微服务不只是代码层面的事，它对运维体系的要求是质变级的。&lt;/p&gt;
&lt;p&gt;单体架构的运维很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一台服务器，跑一个进程&lt;/li&gt;
&lt;li&gt;一个 Nginx 做反向代理&lt;/li&gt;
&lt;li&gt;一个监控面板看 CPU、内存、QPS&lt;/li&gt;
&lt;li&gt;出了问题看一个日志文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;微服务架构的运维：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes 集群，至少 3 个节点做高可用&lt;/li&gt;
&lt;li&gt;服务注册与发现（Consul、Nacos、Eureka）&lt;/li&gt;
&lt;li&gt;API 网关（Kong、Traefik、APISIX）&lt;/li&gt;
&lt;li&gt;分布式链路追踪（Jaeger、Zipkin、SkyWalking）&lt;/li&gt;
&lt;li&gt;集中式日志（ELK、Loki）&lt;/li&gt;
&lt;li&gt;服务网格（Istio、Linkerd）——可选但推荐&lt;/li&gt;
&lt;li&gt;配置中心（Apollo、Spring Cloud Config）&lt;/li&gt;
&lt;li&gt;熔断限流（Sentinel、Hystrix）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;每一项都是人力成本&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;有个传统企业做数字化转型，CTO 是从互联网大厂挖来的，一上来就推微服务。招了 5 个 Java 开发，写了 12 个服务，但没有专职运维。&lt;/p&gt;
&lt;p&gt;上线后噩梦开始了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务注册中心偶尔抽风，服务互相找不到&lt;/li&gt;
&lt;li&gt;链路追踪没配好，一个请求慢在哪根本查不出&lt;/li&gt;
&lt;li&gt;日志分散在 12 个容器里，排查问题要 &lt;code&gt;kubectl logs&lt;/code&gt; 12 次&lt;/li&gt;
&lt;li&gt;配置中心的权限没管好，有人把生产环境的数据库密码提交到了测试环境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;半年后，这个 CTO 离职了。接手的架构师第一件事是把 12 个服务合并成 3 个，运维成本直接降了 70%。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;微服务的运维成本不是线性增长的，是指数级的&lt;/strong&gt;。服务数量从 1 增加到 10，运维复杂度可能从 1 增加到 100。&lt;/p&gt;
&lt;p&gt;如果你没有专职的 SRE 团队，没有成熟的 CI/CD 流水线，没有完善的监控告警体系——&lt;strong&gt;别碰微服务&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="性能瓶颈不在架构拆了也没用"&gt;&lt;a href="#%e6%80%a7%e8%83%bd%e7%93%b6%e9%a2%88%e4%b8%8d%e5%9c%a8%e6%9e%b6%e6%9e%84%e6%8b%86%e4%ba%86%e4%b9%9f%e6%b2%a1%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;性能瓶颈不在架构？拆了也没用
&lt;/h2&gt;&lt;p&gt;很多人拆微服务的理由是&amp;quot;单体太慢了&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;但慢的原因是什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据库没加索引，全表扫描&lt;/li&gt;
&lt;li&gt;N+1 查询问题，一个列表页发 100 次 SQL&lt;/li&gt;
&lt;li&gt;没做缓存，每次都查库&lt;/li&gt;
&lt;li&gt;同步调用太多，一个请求串行调 5 个外部接口&lt;/li&gt;
&lt;li&gt;代码写得烂，循环里套循环&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这些问题，拆微服务一个都解决不了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;数据库慢，拆成两个数据库还是慢。N+1 查询，拆成两个服务还是有 N+1。没做缓存，拆了还是没做。代码烂，拆了还是烂。&lt;/p&gt;
&lt;p&gt;有个内容平台，首页加载要 8 秒。团队讨论后决定拆微服务：用户服务、内容服务、推荐服务、评论服务。&lt;/p&gt;
&lt;p&gt;拆完一测，首页加载变成了 12 秒。因为原来一次数据库查询能拿到的数据，现在要发 4 次 HTTP 请求，每次都有网络开销。&lt;/p&gt;
&lt;p&gt;后来一个资深工程师介入，做了三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给内容表加了复合索引&lt;/li&gt;
&lt;li&gt;用 Redis 缓存热点内容&lt;/li&gt;
&lt;li&gt;把推荐算法从同步调用改成异步预计算&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;首页加载从 8 秒降到 1.2 秒。&lt;strong&gt;一行微服务代码都没写&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;性能优化的 80% 收益来自 20% 的低垂果实。在拆微服务之前，先把这些果实摘了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="成本算过吗微服务真的很贵"&gt;&lt;a href="#%e6%88%90%e6%9c%ac%e7%ae%97%e8%bf%87%e5%90%97%e5%be%ae%e6%9c%8d%e5%8a%a1%e7%9c%9f%e7%9a%84%e5%be%88%e8%b4%b5" class="header-anchor"&gt;&lt;/a&gt;成本算过吗？微服务真的很贵
&lt;/h2&gt;&lt;p&gt;微服务的隐性成本经常被忽略。&lt;/p&gt;
&lt;p&gt;开发成本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个服务都要写一遍认证、鉴权、日志、监控&lt;/li&gt;
&lt;li&gt;服务间通信要定义协议、处理超时、重试、熔断&lt;/li&gt;
&lt;li&gt;联调要启动多个服务，本地开发环境搭建复杂&lt;/li&gt;
&lt;li&gt;一个功能改三个服务，代码评审要拉三个人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测试成本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单元测试好写，集成测试难写&lt;/li&gt;
&lt;li&gt;端到端测试要启动整个服务栈，跑一次半小时&lt;/li&gt;
&lt;li&gt;服务版本兼容性问题，A 服务升级了，B 服务没跟上，测试环境炸了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部署成本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;12 个服务要部署 12 次，流水线要写 12 份&lt;/li&gt;
&lt;li&gt;服务依赖顺序要理清，A 依赖 B，B 依赖 C，部署顺序不能乱&lt;/li&gt;
&lt;li&gt;回滚要协调，A 回滚了，B 和 C 要不要一起回滚？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;运维成本前面说过了，不再赘述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这些成本加起来，微服务的总拥有成本（TCO）可能是单体的 3-5 倍&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;有个创业公司，A 轮融资后想&amp;quot;规范化&amp;rdquo;，把单体拆成了 8 个微服务。拆的过程花了 4 个月，3 个全职开发。拆完后每月云资源费用从 8000 涨到 28000。&lt;/p&gt;
&lt;p&gt;B 轮融资失败，公司要省钱。第一件事就是把微服务合回单体，云资源费用降回 9000。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术选型不能脱离商业语境&lt;/strong&gt;。活下去比架构优雅重要得多。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="决策矩阵该不该拆微服务"&gt;&lt;a href="#%e5%86%b3%e7%ad%96%e7%9f%a9%e9%98%b5%e8%af%a5%e4%b8%8d%e8%af%a5%e6%8b%86%e5%be%ae%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;决策矩阵：该不该拆微服务？
&lt;/h2&gt;&lt;p&gt;说了这么多&amp;quot;不该拆&amp;quot;的场景，那什么时候该拆？&lt;/p&gt;
&lt;p&gt;我整理了一个决策矩阵，你可以对着打分：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;强烈建议拆&lt;/th&gt;
&lt;th&gt;可以考虑拆&lt;/th&gt;
&lt;th&gt;别拆&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;团队规模&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt; 100 人，多团队协作&lt;/td&gt;
&lt;td&gt;30-100 人，按域分组&lt;/td&gt;
&lt;td&gt;&amp;lt; 30 人，一个团队&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;业务稳定性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;核心域稳定 2 年以上&lt;/td&gt;
&lt;td&gt;部分域稳定，部分还在变&lt;/td&gt;
&lt;td&gt;整体业务还在探索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;发布频率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不同模块发布节奏差异大&lt;/td&gt;
&lt;td&gt;部分模块需要独立发布&lt;/td&gt;
&lt;td&gt;整体一起发布即可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;扩展需求&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不同模块资源需求差异大&lt;/td&gt;
&lt;td&gt;部分模块需要独立扩展&lt;/td&gt;
&lt;td&gt;整体扩展即可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据一致性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;能容忍最终一致性&lt;/td&gt;
&lt;td&gt;部分场景强一致，部分可放松&lt;/td&gt;
&lt;td&gt;全局强一致&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;运维能力&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;有专职 SRE，成熟 K8s&lt;/td&gt;
&lt;td&gt;有基础 CI/CD，能搞定监控&lt;/td&gt;
&lt;td&gt;运维靠开发兼职&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;技术栈&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不同模块需要不同语言/框架&lt;/td&gt;
&lt;td&gt;主体统一，少量异构&lt;/td&gt;
&lt;td&gt;统一技术栈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;满足 3 个以上&amp;quot;强烈建议拆&amp;quot;的条件，才值得认真考虑微服务&lt;/strong&gt;。否则，模块化单体是更稳妥的选择。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="模块化单体被低估的中间路线"&gt;&lt;a href="#%e6%a8%a1%e5%9d%97%e5%8c%96%e5%8d%95%e4%bd%93%e8%a2%ab%e4%bd%8e%e4%bc%b0%e7%9a%84%e4%b8%ad%e9%97%b4%e8%b7%af%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;模块化单体：被低估的中间路线
&lt;/h2&gt;&lt;p&gt;很多人不知道&amp;quot;模块化单体&amp;quot;这个选项。&lt;/p&gt;
&lt;p&gt;它的核心思想是：&lt;strong&gt;代码层面按模块划分，部署层面仍是一体&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;举个例子，一个电商系统可以这样组织：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;monolith/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── user/ # 用户模块
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── api.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── service.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── repository.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── order/ # 订单模块
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── api.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── service.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── repository.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── payment/ # 支付模块
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── api.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── service.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── repository.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── shared/ # 共享基础设施
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── database.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── cache.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── auth.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;模块之间通过明确的接口通信，禁止直接访问对方的数据库表。代码评审时，跨模块的调用要严格审查。&lt;/p&gt;
&lt;p&gt;这种架构的好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保留了单体的部署简单、调试方便&lt;/li&gt;
&lt;li&gt;代码边界清晰，未来要拆某个模块出去很容易&lt;/li&gt;
&lt;li&gt;团队可以按模块分工，减少冲突&lt;/li&gt;
&lt;li&gt;性能更好，没有网络开销&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shopify 的核心系统就是一个巨大的模块化单体，支撑着每年几十亿美元的 GMV。他们内部叫&amp;quot;Modular Monolith&amp;quot;，跑了十几年，稳定性吊打很多微服务系统。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;架构演进不是一步到位的事。先单体，再模块化单体，最后才是微服务——这是更务实的路径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="拆了再合回来丢人吗"&gt;&lt;a href="#%e6%8b%86%e4%ba%86%e5%86%8d%e5%90%88%e5%9b%9e%e6%9d%a5%e4%b8%a2%e4%ba%ba%e5%90%97" class="header-anchor"&gt;&lt;/a&gt;拆了再合回来，丢人吗？
&lt;/h2&gt;&lt;p&gt;不丢人。&lt;/p&gt;
&lt;p&gt;亚马逊的 Prime Video，2023 年把一部分微服务合回了单体，节省了 90% 的运维成本。这事被写成技术博客，全网传疯。&lt;/p&gt;
&lt;p&gt;很多人觉得&amp;quot;拆了又合&amp;quot;是决策失误。其实不是。&lt;strong&gt;架构决策是基于当时的信息和约束做的最优选择&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;半年前业务高速增长，团队扩张，拆微服务是对的。半年后业务收缩，团队精简，合回单体也是对的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构不是一锤子买卖，它是持续演进的过程&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;有个做直播的团队，2021 年行业火爆，团队从 20 人扩到 80 人，把单体拆成了 15 个微服务。2023 年行业寒冬，团队裁到 30 人，又把 15 个服务合成了 4 个。&lt;/p&gt;
&lt;p&gt;这不是反复横跳，这是&lt;strong&gt;根据约束条件动态调整&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;技术债务不是&amp;quot;没上微服务&amp;quot;，而是&amp;quot;上了微服务但维护不起&amp;quot;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="写在决策之前"&gt;&lt;a href="#%e5%86%99%e5%9c%a8%e5%86%b3%e7%ad%96%e4%b9%8b%e5%89%8d" class="header-anchor"&gt;&lt;/a&gt;写在决策之前
&lt;/h2&gt;&lt;p&gt;下次有人提议拆微服务，你可以问几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;我们要解决什么问题？&lt;/strong&gt; 是部署冲突？是扩展瓶颈？还是团队沟通成本？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;这个问题用微服务能解决吗？&lt;/strong&gt; 如果是代码写得烂，拆了还是烂。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我们有能力承担微服务的成本吗？&lt;/strong&gt; 运维、测试、联调、监控，每一项都是钱和人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有没有更轻量的方案？&lt;/strong&gt; 模块化单体、代码分层、更好的 CI/CD，可能就够了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果半年后要合回来，代价大吗？&lt;/strong&gt; 如果拆分不可逆，说明设计有问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;架构决策的本质是&lt;strong&gt;权衡取舍&lt;/strong&gt;。微服务不是银弹，单体也不是原罪。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选对架构，比选先进架构重要得多。&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>