后端微服务缺乏隔离测试环境,依赖共享预发布环境导致效率低下。引入服务分支,为每个Git分支创建独立的沙盒环境,实现完整的虚拟堆栈,提升开发速度与质量。
译自:Merging To Test Is Killing Your Microservices Velocity
作者:Arjun Iyer
如果您是平台工程师或工程负责人,请审视您当前的开发流水线。是否所有事物都得到了平等对待?
对我而言,似乎我们在对待堆栈不同部分的方式上存在明显差异。
当前端开发人员将代码推送到功能分支时,Vercel或Netlify等工具会立即启动部署预览。这是一个与生产环境隔离的唯一URL,开发人员可以在其中点击并即时验证更改。
当数据库工程师需要测试模式迁移时,Neon或PlanetScale等现代平台允许他们对数据库进行分支。他们可以获得生产数据的隔离的写时复制克隆,以便进行破坏和修复,而不会影响任何真实用户。
但是,当后端工程师将更改推送到由50个微服务组成的网格中的一个微服务时,会发生什么?
什么也不会发生。
我们的云原生堆栈中间存在一个巨大的漏洞。尽管前端和数据层已经发展到支持基于分支的开发,但后端服务层仍停留在共享环境的石器时代。
这不仅仅是烦恼。它是阻碍团队真正“左移”的主要瓶颈。
合并验证反模式
在大多数分布式架构中,开发后端服务的开发人员无法在自己的笔记本电脑上真实运行整个平台。它太沉重了。
因此,他们依赖于单元测试和模拟。但我们都知道模拟是骗子。它们无法捕捉服务之间的契约偏差或仅在网络上出现的延迟问题。
为了获得真正的验证,开发人员必须将其分支合并到主干,以便将其部署到共享的预发布环境。
这就是速度消亡的地方。
- 排队: 开发人员排队等待部署到预发布环境。
- 阻塞: 如果一个开发人员破坏了预发布环境,所有人都将被阻塞。
- 干扰: 测试失败,但这是您的代码问题,还是五分钟前有人向认证服务部署了错误的配置?
我们已经将这种功能障碍常态化。我们把预发布环境视为一个脆弱、神圣的单体。但在一个我们希望每天多次部署的时代,仅仅为了查看代码是否工作而合并到主干是倒退的。这就像在检查蓝图之前就浇筑混凝土。
解决方案:服务分支
我们需要将 Vercel 和 Neon 的经验带到 Kubernetes 后端。我们需要服务分支。
目标很简单。每个 Git 分支都应该产生一个可测试的、隔离的环境。
然而,微服务的物理特性使得这变得困难。您无法为每个拉取请求复制一个包含100多个服务的集群。成本和启动时间将是令人望而却步的。
解决方案不是复制。它是隔离。
想象一个基础环境,即您现有的预发布集群,运行着所有服务的稳定版本。当开发人员将更改推送到特定服务时,平台不应该克隆整个集群。它应该简单地启动一个只包含已修改服务的轻量级沙盒。
智能路由完成其余工作:
新的心智模型:Git 等同于环境
为了使其大规模工作,平台工程师需要提供一个清晰的心智模型,将源代码直接映射到基础设施。
新标准如下所示:
- 主干(main)对应于基线环境(预发布环境)。这是事实的来源。它代表了所有服务按预期交互的稳定世界状态。
- 功能分支(feat-xyz)对应于沙盒环境。这是临时的。它只在PR打开期间存在。它只包含该特定分支中已更改的服务增量。
当开发人员打开一个PR时,他们不需要考虑集群或命名空间。他们只会得到一个完美反映其分支的专用游乐场。
圣杯:完整的虚拟堆栈
当您将这种服务分支方法与现有的前端和数据库分支工具结合起来时,您将解锁一个强大的功能:每个分支一个完整的虚拟堆栈。
想象一个工作流,开发人员创建一个分支,然后一个完整的、隔离的环境奇迹般地出现。对开发人员来说,这感觉就像他们拥有整个公司基础设施的私有副本。
这包括前端、后端服务和数据库模式。它们都与其特定的代码更改保持一致。
他们可以在合并之前在其分支上运行端到端集成测试。他们可以向产品经理提供一个URL来演示功能。他们可以安全地验证复杂的迁移。这是为其功能量身定制的现实环境,即时创建,并同样迅速地销毁。
为什么这很重要:大规模的速度与质量
这种模式将范式从串行阻塞转变为大规模并行。
- 消除瓶颈: 大型工程团队不再需要排队等待预发布环境。您可以让10、50甚至100名开发人员和代理同时测试,而不会互相干扰。
- 真正的左移: 集成测试在开发期间发生,而不是在合并之后。您在编写代码时就捕获了错误,而不是三天后预发布构建失败时。
- 更高质量,更快: 当测试变得容易和隔离时,人们会进行更多的测试。我们不再害怕部署,并开始将其视为常规操作。
结果是软件交付流水线既显著更快又更稳定。
弥补差距
实现这一目标的技术已经存在。模式已经得到验证。是时候让平台团队停止管理静态环境,转而管理动态的、短暂的工作流了。
如果您希望实现此服务分支层来完善您的测试策略,这正是Signadot的用武之地。Signadot 提供了将基于请求的隔离引入 Kubernetes 的编排层。
停止合并以测试。开始分支以验证。


