<?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/%E5%90%88%E5%B9%B6%E7%BC%96%E8%AF%91/</link><description>Recent content in 合并编译 on 文艺技术笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>文艺技术笔记 | 软件工程师文艺</copyright><lastBuildDate>Wed, 24 Jun 2026 23:30:00 +0800</lastBuildDate><atom:link href="https://wenyiblog.top/tags/%E5%90%88%E5%B9%B6%E7%BC%96%E8%AF%91/index.xml" rel="self" type="application/rss+xml"/><item><title>大规模微服务的归拢之道：从合并编译到服务精简的治理实践</title><link>https://wenyiblog.top/2026/06/microservice-consolidation-governance/</link><pubDate>Wed, 24 Jun 2026 23:30:00 +0800</pubDate><guid>https://wenyiblog.top/2026/06/microservice-consolidation-governance/</guid><description>&lt;h2 id="微服务拆了五年该收一收了"&gt;&lt;a href="#%e5%be%ae%e6%9c%8d%e5%8a%a1%e6%8b%86%e4%ba%86%e4%ba%94%e5%b9%b4%e8%af%a5%e6%94%b6%e4%b8%80%e6%94%b6%e4%ba%86" class="header-anchor"&gt;&lt;/a&gt;微服务拆了五年，该收一收了
&lt;/h2&gt;&lt;p&gt;过去十年，微服务架构几乎成了互联网行业的技术共识。从单体应用中剥离出独立的服务单元，让每个团队专注于自己的领域，让每个服务独立部署、独立演进——这套叙事在 PPT 上永远漂亮。于是，一家中型电商公司拆出了三百多个微服务，一个社交平台的后台跑着上千个容器，一个支付系统的调用链路里跳了十七跳。&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;p&gt;本文将从&lt;strong&gt;合并编译&lt;/strong&gt;和&lt;strong&gt;服务精简&lt;/strong&gt;两个维度出发，系统讨论大规模微服务的归拢治理实践，涵盖技术手段、架构策略、方法论判断和组织配套。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="过度拆分的三大症状"&gt;&lt;a href="#%e8%bf%87%e5%ba%a6%e6%8b%86%e5%88%86%e7%9a%84%e4%b8%89%e5%a4%a7%e7%97%87%e7%8a%b6" class="header-anchor"&gt;&lt;/a&gt;过度拆分的三大症状
&lt;/h2&gt;&lt;p&gt;在讨论&amp;quot;怎么收&amp;quot;之前，先搞清楚&amp;quot;为什么该收&amp;quot;。过度拆分的微服务架构，通常会呈现出三类典型症状。&lt;/p&gt;
&lt;h3 id="症状一运维成本指数级膨胀"&gt;&lt;a href="#%e7%97%87%e7%8a%b6%e4%b8%80%e8%bf%90%e7%bb%b4%e6%88%90%e6%9c%ac%e6%8c%87%e6%95%b0%e7%ba%a7%e8%86%a8%e8%83%80" class="header-anchor"&gt;&lt;/a&gt;症状一：运维成本指数级膨胀
&lt;/h3&gt;&lt;p&gt;微服务的运维成本不是线性增长的。当服务数量从 50 增长到 500，需要管理的不再是 10 倍的关系，而是呈指数级放大的复杂度：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;运维维度&lt;/th&gt;
&lt;th&gt;50 个服务&lt;/th&gt;
&lt;th&gt;500 个服务&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;/td&gt;
&lt;td&gt;~200 条&lt;/td&gt;
&lt;td&gt;~5000 条&lt;/td&gt;
&lt;td&gt;25x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD 流水线维护&lt;/td&gt;
&lt;td&gt;50 套配置&lt;/td&gt;
&lt;td&gt;500 套配置（含分支策略）&lt;/td&gt;
&lt;td&gt;10x+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;监控告警规则&lt;/td&gt;
&lt;td&gt;~500 条&lt;/td&gt;
&lt;td&gt;~8000 条&lt;/td&gt;
&lt;td&gt;16x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;可控&lt;/td&gt;
&lt;td&gt;大量低利用率 Pod&lt;/td&gt;
&lt;td&gt;3x~5x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;一个真实的行业案例：某出行平台在微服务高峰期维护着超过 4000 个服务实例，其中近三成服务的 QPS 长期低于个位数，但每个服务都需要独立的监控、日志、告警、发布流水线。这些&amp;quot;僵尸微服务&amp;quot;吞噬了大量运维资源，却不产生任何业务价值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="症状二调用链路深不见底"&gt;&lt;a href="#%e7%97%87%e7%8a%b6%e4%ba%8c%e8%b0%83%e7%94%a8%e9%93%be%e8%b7%af%e6%b7%b1%e4%b8%8d%e8%a7%81%e5%ba%95" class="header-anchor"&gt;&lt;/a&gt;症状二：调用链路深不见底
&lt;/h3&gt;&lt;p&gt;当一个简单的&amp;quot;查询用户订单&amp;quot;请求需要经过网关 → 用户服务 → 鉴权服务 → 订单服务 → 库存服务 → 优惠服务 → 支付服务 → 通知服务……八个跳点，任何一个环节的抖动都会导致整条链路超时。&lt;/p&gt;
&lt;p&gt;这带来的问题不仅是性能损耗：&lt;/p&gt;
&lt;ul&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;：改一个底层服务的字段，上游十几个服务都可能受影响&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="症状三团队协作反而变慢"&gt;&lt;a href="#%e7%97%87%e7%8a%b6%e4%b8%89%e5%9b%a2%e9%98%9f%e5%8d%8f%e4%bd%9c%e5%8f%8d%e8%80%8c%e5%8f%98%e6%85%a2" class="header-anchor"&gt;&lt;/a&gt;症状三：团队协作反而变慢
&lt;/h3&gt;&lt;p&gt;微服务的一个核心承诺是&amp;quot;让团队独立工作、独立交付&amp;quot;。但现实往往是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个业务需求涉及五六个服务的改动，需要五个团队排期协调&lt;/li&gt;
&lt;li&gt;服务间接口频繁变更，联调成本居高不下&lt;/li&gt;
&lt;li&gt;公共库的版本冲突让多个服务被迫同步升级&lt;/li&gt;
&lt;li&gt;新人入职需要 clone 几十个仓库，理解复杂的依赖拓扑&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;当&amp;quot;拆&amp;quot;本身成了效率的瓶颈，就说明已经越过了拆分的最优边界。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="合并编译技术层面的归拢手段"&gt;&lt;a href="#%e5%90%88%e5%b9%b6%e7%bc%96%e8%af%91%e6%8a%80%e6%9c%af%e5%b1%82%e9%9d%a2%e7%9a%84%e5%bd%92%e6%8b%a2%e6%89%8b%e6%ae%b5" class="header-anchor"&gt;&lt;/a&gt;合并编译：技术层面的归拢手段
&lt;/h2&gt;&lt;p&gt;在动手合并服务之前，有一个更轻量、更安全的归拢手段可以先做起来——&lt;strong&gt;合并编译&lt;/strong&gt;。它的核心思路是：不改运行时架构，先在开发和构建层面把散落的服务归拢到一起。&lt;/p&gt;
&lt;h3 id="什么是合并编译"&gt;&lt;a href="#%e4%bb%80%e4%b9%88%e6%98%af%e5%90%88%e5%b9%b6%e7%bc%96%e8%af%91" class="header-anchor"&gt;&lt;/a&gt;什么是合并编译
&lt;/h3&gt;&lt;p&gt;合并编译，是指将多个原本独立仓库、独立构建的微服务代码，合入到一个统一的代码仓库（通常是 Monorepo）中，共享同一套 CI/CD 流水线和依赖管理体系。&lt;/p&gt;
&lt;p&gt;它不要求改变服务的运行时部署形态——各个服务仍然可以独立部署、独立扩缩容。但在代码管理、构建流程、依赖治理层面，它们被&amp;quot;归拢&amp;quot;到了一个统一的技术底座上。&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;合并编译（Monorepo）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;代码仓库&lt;/td&gt;
&lt;td&gt;每个服务一个 Git 仓库&lt;/td&gt;
&lt;td&gt;多个服务共享一个仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&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;/td&gt;
&lt;td&gt;各自维护版本号&lt;/td&gt;
&lt;td&gt;统一版本锁定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&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;/td&gt;
&lt;td&gt;通过 SDK/NPM 包传递&lt;/td&gt;
&lt;td&gt;直接引用内部模块&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="monorepo-不等于回到单体"&gt;&lt;a href="#monorepo-%e4%b8%8d%e7%ad%89%e4%ba%8e%e5%9b%9e%e5%88%b0%e5%8d%95%e4%bd%93" class="header-anchor"&gt;&lt;/a&gt;Monorepo 不等于回到单体
&lt;/h3&gt;&lt;p&gt;这是最常见的误解。Monorepo 是&lt;strong&gt;代码组织策略&lt;/strong&gt;，单体是&lt;strong&gt;运行时架构&lt;/strong&gt;，两者正交。一个 Monorepo 里可以有几十个独立部署的微服务，也可以有共享的库和工具。关键区别在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单体架构&lt;/strong&gt;：所有代码编译成一个制品，部署为一个进程，共享一个数据库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monorepo + 微服务&lt;/strong&gt;：同一仓库中包含多个服务的代码，但每个服务独立编译、独立部署、独立拥有数据存储&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google、Meta 等公司早已验证了 Monorepo 在超大规模工程中的可行性。国内多家大型互联网公司也在过去几年完成了从多仓到单仓的迁移。&lt;/p&gt;
&lt;h3 id="合并编译的实施路径"&gt;&lt;a href="#%e5%90%88%e5%b9%b6%e7%bc%96%e8%af%91%e7%9a%84%e5%ae%9e%e6%96%bd%e8%b7%af%e5%be%84" class="header-anchor"&gt;&lt;/a&gt;合并编译的实施路径
&lt;/h3&gt;&lt;h4 id="第一步仓库归拢"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e4%bb%93%e5%ba%93%e5%bd%92%e6%8b%a2" class="header-anchor"&gt;&lt;/a&gt;第一步：仓库归拢
&lt;/h4&gt;&lt;p&gt;将分散的 Git 仓库合并到一个 Monorepo 中。常见的目录结构如下：&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-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;monorepo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;codegen&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scripts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;ci&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;BUILD&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bazel&lt;/span&gt;
&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;ul&gt;
&lt;li&gt;&lt;strong&gt;Git 历史保留&lt;/strong&gt;：使用 &lt;code&gt;git subtree&lt;/code&gt; 或 &lt;code&gt;git filter-repo&lt;/code&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 流水线跑通后再迁移下一批&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="第二步统一-cicd-流水线"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e7%bb%9f%e4%b8%80-cicd-%e6%b5%81%e6%b0%b4%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;第二步：统一 CI/CD 流水线
&lt;/h4&gt;&lt;p&gt;这是合并编译的核心价值所在。在分散仓库时代，每个服务都有自己的 Jenkinsfile 或 GitHub Actions 配置，格式不一、标准各异。归拢之后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一套流水线模板&lt;/strong&gt;：所有服务共享同一套构建、测试、部署模板&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量构建&lt;/strong&gt;：通过代码变更分析（如 Bazel 的依赖图分析），只构建受影响的服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一质量门禁&lt;/strong&gt;：代码扫描、单元测试覆盖率、安全审计等规则统一管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原子变更&lt;/strong&gt;：跨服务的接口修改可以在一个 commit 中完成，避免版本不一致&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;增量构建是关键。一个包含 200 个服务的 Monorepo，如果每次提交都全量编译，构建时间会让人崩溃。成熟的增量构建系统可以将平均构建时间从小时级降低到分钟级。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="第三步依赖治理统一化"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e4%be%9d%e8%b5%96%e6%b2%bb%e7%90%86%e7%bb%9f%e4%b8%80%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;第三步：依赖治理统一化
&lt;/h4&gt;&lt;p&gt;多仓库时代最头疼的问题之一是依赖版本冲突。服务 A 用 protobuf 3.19，服务 B 用 protobuf 3.21，当它们通过公共库产生间接依赖时，版本冲突让人抓狂。&lt;/p&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;：通过 Dependabot 或 Renovate 统一管理依赖升级&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消除幽灵依赖&lt;/strong&gt;：在统一构建系统中，每个模块必须显式声明依赖，杜绝隐式传递&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共享基础库&lt;/strong&gt;：公共工具类、中间件封装等直接作为仓库内模块引用，告别&amp;quot;发版-更新-兼容&amp;quot;的循环&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="合并编译的收益量化"&gt;&lt;a href="#%e5%90%88%e5%b9%b6%e7%bc%96%e8%af%91%e7%9a%84%e6%94%b6%e7%9b%8a%e9%87%8f%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;合并编译的收益量化
&lt;/h3&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;跨服务接口变更周期&lt;/td&gt;
&lt;td&gt;缩短 60%~80%&lt;/td&gt;
&lt;td&gt;从&amp;quot;发版协调&amp;quot;变为&amp;quot;同仓库原子提交&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI 配置维护成本&lt;/td&gt;
&lt;td&gt;降低 70%+&lt;/td&gt;
&lt;td&gt;一套模板替代几百套独立配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依赖冲突排查时间&lt;/td&gt;
&lt;td&gt;降低 90%+&lt;/td&gt;
&lt;td&gt;统一版本锁定消除绝大多数冲突&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新人上手时间&lt;/td&gt;
&lt;td&gt;缩短 40%~50%&lt;/td&gt;
&lt;td&gt;一个仓库看到全貌，不用到处找代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;构建资源利用率&lt;/td&gt;
&lt;td&gt;提升 2~3 倍&lt;/td&gt;
&lt;td&gt;增量构建避免重复编译&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="服务精简架构层面的归拢策略"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e7%b2%be%e7%ae%80%e6%9e%b6%e6%9e%84%e5%b1%82%e9%9d%a2%e7%9a%84%e5%bd%92%e6%8b%a2%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;服务精简：架构层面的归拢策略
&lt;/h2&gt;&lt;p&gt;合并编译解决了&amp;quot;开发态&amp;quot;的碎片化问题，但运行时的服务数量仍然庞大。接下来需要在架构层面做更深层的归拢——&lt;strong&gt;服务精简&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="领域边界的重新划分"&gt;&lt;a href="#%e9%a2%86%e5%9f%9f%e8%be%b9%e7%95%8c%e7%9a%84%e9%87%8d%e6%96%b0%e5%88%92%e5%88%86" class="header-anchor"&gt;&lt;/a&gt;领域边界的重新划分
&lt;/h3&gt;&lt;p&gt;微服务拆分之初，团队往往对领域驱动设计（DDD）的理解不够深入，导致边界划分过细。常见的过度拆分模式包括：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;按数据表拆分&lt;/strong&gt;：每张表一个服务——用户表是用户服务，地址表是地址服务，登录记录表是登录服务。这不是微服务，这是&amp;quot;分布式数据库访问层&amp;quot;。&lt;/p&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;
&lt;p&gt;重新划分领域边界的思路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;从业务流程出发&lt;/strong&gt;，而非从数据模型出发。一个完整的业务用例（如&amp;quot;下单&amp;quot;）所涉及的操作，如果变更频率相似、数据关联紧密，就应该归属到同一个限界上下文&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;/ol&gt;
&lt;h3 id="功能合并的实操策略"&gt;&lt;a href="#%e5%8a%9f%e8%83%bd%e5%90%88%e5%b9%b6%e7%9a%84%e5%ae%9e%e6%93%8d%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;功能合并的实操策略
&lt;/h3&gt;&lt;p&gt;识别出可以合并的服务之后，合并过程需要稳妥推进：&lt;/p&gt;
&lt;h4 id="合并前的评估清单"&gt;&lt;a href="#%e5%90%88%e5%b9%b6%e5%89%8d%e7%9a%84%e8%af%84%e4%bc%b0%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;合并前的评估清单
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 两个服务的 QPS 量级是否相近？（避免高流量服务被低流量服务的慢查询拖累）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 两个服务的数据模型是否有强关联？（合并后是否可以消除分布式事务）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 两个服务的变更频率是否趋同？（合并后不会造成发布冲突加剧）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 合并后的代码量是否在可控范围内？（通常单个服务不超过 5 万行核心代码）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 合并是否能消除至少一条跨服务调用链路？&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="合并的技术步骤"&gt;&lt;a href="#%e5%90%88%e5%b9%b6%e7%9a%84%e6%8a%80%e6%9c%af%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;合并的技术步骤
&lt;/h4&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;：对外的 API 保持不变，内部从 RPC 调用变为本地方法调用&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;：确认无流量后，下线旧服务，清理相关配置和监控&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;合并过程中最重要的原则是&lt;strong&gt;对外接口不变&lt;/strong&gt;。上游调用方不需要感知底层的服务合并，这大幅降低了变更风险。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="废弃服务的清理"&gt;&lt;a href="#%e5%ba%9f%e5%bc%83%e6%9c%8d%e5%8a%a1%e7%9a%84%e6%b8%85%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;废弃服务的清理
&lt;/h3&gt;&lt;p&gt;除了合并，还有一类重要的归拢动作：清理那些已经不再有业务价值的&amp;quot;僵尸服务&amp;quot;。&lt;/p&gt;
&lt;p&gt;僵尸服务的典型特征：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;流量归零&lt;/strong&gt;：连续 90 天没有任何线上流量&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;：A/B 测试或临时活动产生的服务，活动结束后没有清理&lt;/li&gt;
&lt;/ul&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;：在内部公告中列出拟下线服务清单，留出 2~4 周的缓冲期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降级阶段&lt;/strong&gt;：将服务标记为&amp;quot;即将下线&amp;quot;，在网关层添加废弃提示头&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 流水线、归档代码仓库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理阶段&lt;/strong&gt;：删除监控面板、告警规则、文档中的相关条目&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;一家大型视频平台曾做过一次集中清理，一次性下线了 230 多个僵尸服务，释放了超过 1500 个 CPU 核心的集群资源，同时减少了近 3000 条无效告警规则。运维团队反馈&amp;quot;第一次觉得告警通道安静了&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="治理方法论从拆分到归拢的判断标准"&gt;&lt;a href="#%e6%b2%bb%e7%90%86%e6%96%b9%e6%b3%95%e8%ae%ba%e4%bb%8e%e6%8b%86%e5%88%86%e5%88%b0%e5%bd%92%e6%8b%a2%e7%9a%84%e5%88%a4%e6%96%ad%e6%a0%87%e5%87%86" class="header-anchor"&gt;&lt;/a&gt;治理方法论：从拆分到归拢的判断标准
&lt;/h2&gt;&lt;p&gt;&amp;ldquo;什么时候该拆、什么时候该合&amp;rdquo;——这是微服务治理中最核心也最模糊的问题。下面提供一套可操作的判断框架。&lt;/p&gt;
&lt;h3 id="拆分合理性的四维评估"&gt;&lt;a href="#%e6%8b%86%e5%88%86%e5%90%88%e7%90%86%e6%80%a7%e7%9a%84%e5%9b%9b%e7%bb%b4%e8%af%84%e4%bc%b0" class="header-anchor"&gt;&lt;/a&gt;拆分合理性的四维评估
&lt;/h3&gt;&lt;p&gt;在决定是否保留一个微服务的独立存在时，从四个维度进行评估：&lt;/p&gt;
&lt;p&gt;&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;该服务的资源需求模式是否独特？如果一个服务的 CPU 利用率始终在 5% 以下，它不需要独立的资源配额，合并到更大的服务中更经济。&lt;/p&gt;
&lt;p&gt;&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;该服务是否需要独立的容错边界？如果它的故障不会级联影响其他服务（比如一个内部工具），独立部署的故障隔离收益有限。&lt;/p&gt;
&lt;h3 id="归拢决策矩阵"&gt;&lt;a href="#%e5%bd%92%e6%8b%a2%e5%86%b3%e7%ad%96%e7%9f%a9%e9%98%b5" class="header-anchor"&gt;&lt;/a&gt;归拢决策矩阵
&lt;/h3&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&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;/td&gt;
&lt;td&gt;有独特的 CPU/内存需求模式&lt;/td&gt;
&lt;td&gt;资源利用率极低，无明显特征&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;团队归属&lt;/td&gt;
&lt;td&gt;有专属团队，独立 on-call&lt;/td&gt;
&lt;td&gt;与其他服务共享维护者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;经验法则&lt;/strong&gt;：如果一个服务在四个维度上有两个以上得&amp;quot;低分&amp;quot;，就应该认真考虑将它与其他服务合并。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="归拢的优先级排序"&gt;&lt;a href="#%e5%bd%92%e6%8b%a2%e7%9a%84%e4%bc%98%e5%85%88%e7%ba%a7%e6%8e%92%e5%ba%8f" class="header-anchor"&gt;&lt;/a&gt;归拢的优先级排序
&lt;/h3&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;：代码量少于 2000 行、QPS 低于 10 的服务，优先合并到相邻服务中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高频联动服务合并&lt;/strong&gt;：总是在同一需求中一起改动的服务对，合并后可以大幅减少协调成本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术组件下沉&lt;/strong&gt;：将&amp;quot;缓存管理服务&amp;quot;&amp;ldquo;文件上传服务&amp;quot;等技术组件下沉为中间件，而非独立微服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;领域边界重新划分&lt;/strong&gt;（最低优先级）：这需要更深层的架构调整，放在最后处理&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="组织配套康威定律的另一面"&gt;&lt;a href="#%e7%bb%84%e7%bb%87%e9%85%8d%e5%a5%97%e5%ba%b7%e5%a8%81%e5%ae%9a%e5%be%8b%e7%9a%84%e5%8f%a6%e4%b8%80%e9%9d%a2" class="header-anchor"&gt;&lt;/a&gt;组织配套：康威定律的另一面
&lt;/h2&gt;&lt;p&gt;康威定律告诉我们，系统的架构会映射组织的沟通结构。反过来说，&lt;strong&gt;当我们要调整系统架构时，组织结构也必须同步变化&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="从每个服务一个团队到每个域一个团队"&gt;&lt;a href="#%e4%bb%8e%e6%af%8f%e4%b8%aa%e6%9c%8d%e5%8a%a1%e4%b8%80%e4%b8%aa%e5%9b%a2%e9%98%9f%e5%88%b0%e6%af%8f%e4%b8%aa%e5%9f%9f%e4%b8%80%e4%b8%aa%e5%9b%a2%e9%98%9f" class="header-anchor"&gt;&lt;/a&gt;从&amp;quot;每个服务一个团队&amp;quot;到&amp;quot;每个域一个团队&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;在微服务拆分的高峰期，很多公司推崇&amp;quot;两个披萨团队&amp;quot;模式——每个小团队负责一到两个微服务。这在早期确实带来了灵活性和速度。但当服务数量膨胀到数百个，这种模式的问题暴露了：&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;归拢之后的组织模式应该是：&lt;strong&gt;每个业务域由一个中等规模的团队（8~15 人）负责，域内可以包含多个微服务，但团队对域内的所有服务承担端到端的责任。&lt;/strong&gt;&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;沟通成本&lt;/td&gt;
&lt;td&gt;域内沟通替代跨团队沟通，减少 50%+ 的协调会议&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技术一致性&lt;/td&gt;
&lt;td&gt;同一团队维护的服务天然风格统一&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上下文切换&lt;/td&gt;
&lt;td&gt;工程师对域内所有服务都有上下文，减少知识孤岛&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-call 效率&lt;/td&gt;
&lt;td&gt;域内统一 on-call，不需要同时呼叫多个团队&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="建立服务治理委员会"&gt;&lt;a href="#%e5%bb%ba%e7%ab%8b%e6%9c%8d%e5%8a%a1%e6%b2%bb%e7%90%86%e5%a7%94%e5%91%98%e4%bc%9a" class="header-anchor"&gt;&lt;/a&gt;建立服务治理委员会
&lt;/h3&gt;&lt;p&gt;归拢工作涉及多个团队的利益调整，需要有专门的组织来推动和仲裁。服务治理委员会（或架构治理委员会）的职责包括：&lt;/p&gt;
&lt;ul&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;：定义服务的接入规范、下线流程、监控基线等标准&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;治理委员会不是要成为审批瓶颈，而是要成为&amp;quot;服务卫生&amp;quot;的守护者。就像城市需要规划局来防止无序扩张，微服务生态也需要治理机制来防止无序拆分。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="工程师文化的转变"&gt;&lt;a href="#%e5%b7%a5%e7%a8%8b%e5%b8%88%e6%96%87%e5%8c%96%e7%9a%84%e8%bd%ac%e5%8f%98" class="header-anchor"&gt;&lt;/a&gt;工程师文化的转变
&lt;/h3&gt;&lt;p&gt;归拢治理不仅是技术决策，还涉及工程师文化的转变：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从&amp;quot;我的服务&amp;quot;到&amp;quot;我们的域&amp;quot;&lt;/strong&gt;：打破服务所有权的壁垒，鼓励工程师关注整个业务域而非单个服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从&amp;quot;追求拆分&amp;quot;到&amp;quot;追求简洁&amp;quot;&lt;/strong&gt;：在技术评审中，不再以&amp;quot;服务拆得多细&amp;quot;作为技术能力的衡量标准，而是以&amp;quot;用最少的服务解决问题&amp;quot;为目标。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从&amp;quot;各自为战&amp;quot;到&amp;quot;平台赋能&amp;quot;&lt;/strong&gt;：鼓励基础能力下沉到平台层，业务团队聚焦在业务逻辑上，而非重复建设基础设施。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="实战案例从-600-到-80-的归拢之路"&gt;&lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b%e4%bb%8e-600-%e5%88%b0-80-%e7%9a%84%e5%bd%92%e6%8b%a2%e4%b9%8b%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;实战案例：从 600 到 80 的归拢之路
&lt;/h2&gt;&lt;p&gt;以下综合多家大型互联网公司的公开实践，描述一个典型的归拢治理案例。&lt;/p&gt;
&lt;h3 id="背景"&gt;&lt;a href="#%e8%83%8c%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;背景
&lt;/h3&gt;&lt;p&gt;某大型互联网公司的交易平台，经过四年的微服务演进，服务数量膨胀到 600 余个。团队面临的核心痛点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一次大促前的全链路压测，需要协调 40+ 个团队同步准备环境&lt;/li&gt;
&lt;li&gt;一个&amp;quot;退款&amp;quot;功能的改动需要修改 7 个服务的代码&lt;/li&gt;
&lt;li&gt;超过 150 个服务的日均 QPS 低于 5，但仍然占用独立的计算资源&lt;/li&gt;
&lt;li&gt;新人入职平均需要 3 周才能跑通本地开发环境&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="阶段一合并编译耗时-3-个月"&gt;&lt;a href="#%e9%98%b6%e6%ae%b5%e4%b8%80%e5%90%88%e5%b9%b6%e7%bc%96%e8%af%91%e8%80%97%e6%97%b6-3-%e4%b8%aa%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;阶段一：合并编译（耗时 3 个月）
&lt;/h3&gt;&lt;p&gt;将分散在 600+ 个 Git 仓库中的代码，按业务域归拢到 12 个 Monorepo 中。&lt;/p&gt;
&lt;p&gt;关键动作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;统一使用 Bazel 作为构建系统，实现增量编译&lt;/li&gt;
&lt;li&gt;建立统一的 CI 模板库，所有服务共享同一套流水线&lt;/li&gt;
&lt;li&gt;依赖版本统一锁定，消灭了 80% 以上的依赖冲突问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果：跨服务接口变更的平均交付周期从 5 天缩短到 0.5 天。&lt;/p&gt;
&lt;h3 id="阶段二僵尸服务清理耗时-2-个月"&gt;&lt;a href="#%e9%98%b6%e6%ae%b5%e4%ba%8c%e5%83%b5%e5%b0%b8%e6%9c%8d%e5%8a%a1%e6%b8%85%e7%90%86%e8%80%97%e6%97%b6-2-%e4%b8%aa%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;阶段二：僵尸服务清理（耗时 2 个月）
&lt;/h3&gt;&lt;p&gt;通过自动化脚本扫描服务注册中心和流量监控平台，识别出 180 个僵尸服务（90 天零流量或流量极低）。&lt;/p&gt;
&lt;p&gt;关键动作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建立&amp;quot;服务健康度评分&amp;quot;模型，综合流量、变更频率、团队归属等维度打分&lt;/li&gt;
&lt;li&gt;分批公示下线计划，留出缓冲期让相关方确认&lt;/li&gt;
&lt;li&gt;开发一键下线工具，自动化完成容器回收、配置清理、监控归档&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果：释放了约 2000 个 CPU 核心的资源，清理了 4000+ 条告警规则。&lt;/p&gt;
&lt;h3 id="阶段三服务合并耗时-6-个月"&gt;&lt;a href="#%e9%98%b6%e6%ae%b5%e4%b8%89%e6%9c%8d%e5%8a%a1%e5%90%88%e5%b9%b6%e8%80%97%e6%97%b6-6-%e4%b8%aa%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;阶段三：服务合并（耗时 6 个月）
&lt;/h3&gt;&lt;p&gt;对剩余的活跃服务进行领域重新划分和功能合并。&lt;/p&gt;
&lt;p&gt;关键动作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将原来 14 个&amp;quot;通知类&amp;quot;微服务（短信、邮件、站内信、Push、WebSocket 等）合并为 2 个：消息路由服务和消息投递服务&lt;/li&gt;
&lt;li&gt;将 8 个&amp;quot;用户画像类&amp;quot;微服务合并为 1 个用户标签服务&lt;/li&gt;
&lt;li&gt;将分散在各业务线中的 20+ 个&amp;quot;配置管理&amp;quot;相关服务，统一收拢到平台层的配置中心&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果：活跃服务数量从 420 个精简到 80 个。&lt;/p&gt;
&lt;h3 id="阶段四长效机制建设持续"&gt;&lt;a href="#%e9%98%b6%e6%ae%b5%e5%9b%9b%e9%95%bf%e6%95%88%e6%9c%ba%e5%88%b6%e5%bb%ba%e8%ae%be%e6%8c%81%e7%bb%ad" class="header-anchor"&gt;&lt;/a&gt;阶段四：长效机制建设（持续）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;建立新服务创建的审批流程：必须论证四个维度中至少两个达到&amp;quot;高分&amp;quot;&lt;/li&gt;
&lt;li&gt;每季度做一次服务健康度审计，识别新的归拢机会&lt;/li&gt;
&lt;li&gt;将服务数量纳入团队的技术债务考核指标&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="归拢成果总结"&gt;&lt;a href="#%e5%bd%92%e6%8b%a2%e6%88%90%e6%9e%9c%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;归拢成果总结
&lt;/h3&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;/td&gt;
&lt;td&gt;600+&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;-87%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码仓库数&lt;/td&gt;
&lt;td&gt;600+&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;-98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平均发布协调涉及团队数&lt;/td&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;1.8&lt;/td&gt;
&lt;td&gt;-66%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新人环境搭建时间&lt;/td&gt;
&lt;td&gt;3 周&lt;/td&gt;
&lt;td&gt;2 天&lt;/td&gt;
&lt;td&gt;-90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;基础设施成本&lt;/td&gt;
&lt;td&gt;基线&lt;/td&gt;
&lt;td&gt;-40%&lt;/td&gt;
&lt;td&gt;显著降低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跨服务分布式事务数量&lt;/td&gt;
&lt;td&gt;~200 个/天&lt;/td&gt;
&lt;td&gt;~30 个/天&lt;/td&gt;
&lt;td&gt;-85%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="归拢过程中的常见陷阱"&gt;&lt;a href="#%e5%bd%92%e6%8b%a2%e8%bf%87%e7%a8%8b%e4%b8%ad%e7%9a%84%e5%b8%b8%e8%a7%81%e9%99%b7%e9%98%b1" class="header-anchor"&gt;&lt;/a&gt;归拢过程中的常见陷阱
&lt;/h2&gt;&lt;p&gt;归拢虽好，但操作不当也会踩坑。以下是实践中最常见的几个陷阱：&lt;/p&gt;
&lt;h3 id="陷阱一归拢过头回到单体"&gt;&lt;a href="#%e9%99%b7%e9%98%b1%e4%b8%80%e5%bd%92%e6%8b%a2%e8%bf%87%e5%a4%b4%e5%9b%9e%e5%88%b0%e5%8d%95%e4%bd%93" class="header-anchor"&gt;&lt;/a&gt;陷阱一：归拢过头，回到单体
&lt;/h3&gt;&lt;p&gt;归拢的目标是&amp;quot;合理的微服务数量&amp;quot;，不是&amp;quot;一个服务&amp;quot;。如果一个合并后的服务代码量超过 10 万行、构建时间超过 30 分钟、每次发布都需要全量回归测试，说明合并过头了。&lt;/p&gt;
&lt;h3 id="陷阱二只合代码不合数据"&gt;&lt;a href="#%e9%99%b7%e9%98%b1%e4%ba%8c%e5%8f%aa%e5%90%88%e4%bb%a3%e7%a0%81%e4%b8%8d%e5%90%88%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;陷阱二：只合代码不合数据
&lt;/h3&gt;&lt;p&gt;两个服务合并了代码，但数据库仍然各自独立，结果每次数据操作还是需要跨库查询，复杂度不降反升。合并服务时，数据层的整合方案必须同步设计。&lt;/p&gt;
&lt;h3 id="陷阱三忽视组织配套"&gt;&lt;a href="#%e9%99%b7%e9%98%b1%e4%b8%89%e5%bf%bd%e8%a7%86%e7%bb%84%e7%bb%87%e9%85%8d%e5%a5%97" class="header-anchor"&gt;&lt;/a&gt;陷阱三：忽视组织配套
&lt;/h3&gt;&lt;p&gt;技术上合并了服务，但组织架构没调整，原来负责两个服务的两个团队仍然各自维护&amp;quot;自己的那部分代码&amp;quot;，结果在同一个服务内部产生了隐性的&amp;quot;代码割据&amp;quot;。&lt;/p&gt;
&lt;h3 id="陷阱四一次性大爆炸式合并"&gt;&lt;a href="#%e9%99%b7%e9%98%b1%e5%9b%9b%e4%b8%80%e6%ac%a1%e6%80%a7%e5%a4%a7%e7%88%86%e7%82%b8%e5%bc%8f%e5%90%88%e5%b9%b6" class="header-anchor"&gt;&lt;/a&gt;陷阱四：一次性大爆炸式合并
&lt;/h3&gt;&lt;p&gt;试图在一个月内完成所有服务的归拢，结果引入了大量 bug，团队疲于应付，项目烂尾。正确的做法是&lt;strong&gt;分批渐进&lt;/strong&gt;，每次合并 2~3 个服务，验证稳定后再推进下一批。&lt;/p&gt;
&lt;h3 id="陷阱五没有建立防反弹机制"&gt;&lt;a href="#%e9%99%b7%e9%98%b1%e4%ba%94%e6%b2%a1%e6%9c%89%e5%bb%ba%e7%ab%8b%e9%98%b2%e5%8f%8d%e5%bc%b9%e6%9c%ba%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;陷阱五：没有建立防反弹机制
&lt;/h3&gt;&lt;p&gt;辛辛苦苦精简到 80 个服务，半年后又膨胀到 200 个——因为没有建立新服务创建的审批机制。归拢的成果需要通过治理流程来守护。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="落地建议从哪里开始"&gt;&lt;a href="#%e8%90%bd%e5%9c%b0%e5%bb%ba%e8%ae%ae%e4%bb%8e%e5%93%aa%e9%87%8c%e5%bc%80%e5%a7%8b" class="header-anchor"&gt;&lt;/a&gt;落地建议：从哪里开始
&lt;/h2&gt;&lt;p&gt;对于正在考虑微服务归拢的团队，建议按以下步骤推进：&lt;/p&gt;
&lt;h3 id="第一步摸底盘点12-周"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e6%91%b8%e5%ba%95%e7%9b%98%e7%82%b912-%e5%91%a8" class="header-anchor"&gt;&lt;/a&gt;第一步：摸底盘点（1~2 周）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;拉出全量服务清单，标注每个服务的流量、代码量、维护团队、最近变更时间&lt;/li&gt;
&lt;li&gt;识别僵尸服务（90 天零流量）和高频联动服务对&lt;/li&gt;
&lt;li&gt;输出一份《微服务健康度报告》&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第二步先做合并编译13-个月"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e5%85%88%e5%81%9a%e5%90%88%e5%b9%b6%e7%bc%96%e8%af%9113-%e4%b8%aa%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;第二步：先做合并编译（1~3 个月）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;选择一个业务域作为试点，将该域内的服务迁入 Monorepo&lt;/li&gt;
&lt;li&gt;搭建统一的 CI/CD 流水线模板&lt;/li&gt;
&lt;li&gt;验证增量构建和依赖治理的效果&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第三步清理僵尸服务12-个月"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e6%b8%85%e7%90%86%e5%83%b5%e5%b0%b8%e6%9c%8d%e5%8a%a112-%e4%b8%aa%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;第三步：清理僵尸服务（1~2 个月）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;按照前述的清理六步法，分批下线僵尸服务&lt;/li&gt;
&lt;li&gt;建立自动化的服务健康度监控，持续发现新的僵尸服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第四步推进服务合并36-个月"&gt;&lt;a href="#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e6%8e%a8%e8%bf%9b%e6%9c%8d%e5%8a%a1%e5%90%88%e5%b9%b636-%e4%b8%aa%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;第四步：推进服务合并（3~6 个月）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;按照优先级排序，从微型服务合并开始，逐步推进到领域重新划分&lt;/li&gt;
&lt;li&gt;每批合并后做稳定性验证，确保没有引入新的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第五步建立长效机制持续"&gt;&lt;a href="#%e7%ac%ac%e4%ba%94%e6%ad%a5%e5%bb%ba%e7%ab%8b%e9%95%bf%e6%95%88%e6%9c%ba%e5%88%b6%e6%8c%81%e7%bb%ad" class="header-anchor"&gt;&lt;/a&gt;第五步：建立长效机制（持续）
&lt;/h3&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;hr&gt;
&lt;h2 id="小结"&gt;&lt;a href="#%e5%b0%8f%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;小结
&lt;/h2&gt;&lt;p&gt;微服务治理是一个持续的动态平衡过程。行业走过了&amp;quot;无脑拆分&amp;quot;的狂热期，正在进入&amp;quot;理性归拢&amp;quot;的成熟期。合并编译和服务精简是两把关键的归拢工具：前者在开发态将碎片化的代码和构建流程重新聚拢，后者在运行态将过度拆分的架构重新收敛到合理的粒度。&lt;/p&gt;
&lt;p&gt;归拢不是要否定微服务，而是要让微服务回到它真正擅长的位置——&lt;strong&gt;在合理的粒度上实现独立部署和独立演进，而非为了拆分而拆分&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;最终的衡量标准很简单：团队是否更高效了？系统是否更稳定了？运维是否更轻松了？如果三个问题的答案都是&amp;quot;是&amp;quot;，那归拢就走在正确的路上。&lt;/p&gt;</description></item></channel></rss>