概述

背景介绍

在实际的开发过程中,一个微服务架构系统下的不同微服务可能是由多个团队进行开发与维护的,每个团队只需关注所属的一个或多个微服务,而各个团队维护的微服务之间可能存在相互调用关系。如果一个团队在开发其所属的微服务,调试的时候需要验证完整的微服务调用链路。此时需要依赖其他团队的微服务,如何部署开发联调环境就会遇到以下问题:

  1. 如果所有团队都使用同一套开发联调环境,那么一个团队的测试微服务实例无法正常运行时,会影响其他依赖该微服务的应用也无法正常运行。
  2. 如果每个团队有单独的一套开发联调环境,那么每个团队不仅需要维护自己环境的微服务应用,还需要维护其他团队环境的自身所属微服务应用,效率大大降低。同时,每个团队都需要部署完整的一套微服务架构应用,成本也随着团队数的增加而大大上升。

此时可以使用测试环境路由的架构来帮助部署一套运维简单且成本较低开发联调环境。

什么是测试环境路由

测试环境路由是一种基于服务路由的环境治理策略,核心是维护一个稳定的基线环境作为基础环境,测试环境仅需要部署需要变更的微服务以构成特性环境。部署完成多测试环境后,开发者可以通过一定的路由规则方式,将测试请求打到不同的测试环境,如果测试环境没有相应的微服务处理链路上的请求,那么会降级到基线环境处理。因此,开发者需要将开发新测试的微服务部署到对应的测试环境,而不需要更新或不属于开发者管理的微服务则复用基线环境的服务,完成对应测试环境的测试。

由此可见,多测试环境有两个基础概念,即基线环境和特性环境。

基础概念

基线环境

基线环境(Baseline Environment)是完整稳定的基础环境,是作为同类型下其他环境流量通路的一个兜底可用环境,用户应该尽量保证基线环境的完整性、稳定性。

测试环境

测试环境(Feature Environment)是一种临时环境,仅可能为开发/测试环境类型,测试环境不需要部署全链路完整的服务,而是仅部署本次有变更的服务,其他服务通过服务路由的方式复用基线环境服务资源。

实现原理

方案总览

测试环境路由的样例实现以下图为例,一共有两个测试环境以及一个基线环境。流量从端到端会依次经过以下组件:App -> 网关 -> 用户中心 -> 积分中心 -> 活动中心。

为了达到测试环境路由的能力,开发工作需要做三件事情:

  1. 服务实例染色(标识实例属于哪个测试环境)
  2. 流量染色(标识请求应该被转发到哪个测试环境)
  3. 服务路由 a. 网关根据请求的目标测试环境标签转发到对应的目标测试环境的用户中心. b. 服务调用时,优先转发到同测试环境下的目标服务实例,如果同测试环境下没有服务实例则转发到基线环境.

以下三小节,将会详细介绍这三部分的原理。

服务实例染色

在多测试环境的场景中,需要对每个测试环境部署的实例进行区分,因此需要在实例上打类似于“featureenv=测试环境名”的标签,例如以下几种实践场景:

  1. 应用实例的配置文件中表明其环境信息。
  2. 把实例标签放到机器上的某一个配置文件里,例如 /etc/metadata。
  3. 应用启动时,调用公司的 CMDB 接口获取元信息。

流量染色

流量染色即为每个请求打上目标测试环境标签,路由转发时根据请求标签匹配请求。而流量染色可以分为以下几种方式:

  • 静态染色

静态染色所有经过当前实例的请求都带上当前实例的标签信息。例如经过 env=f1 的实例的请求都携带 env=f1 的标签信息。

  • 动态染色

静态染色是把服务实例的某些标签作为请求标签,服务实例标签相对静态,应用启动后初始化一次之后就不再变更。但是在实际的应用场景下,不同的请求往往需要设置不同的标签信息。此时则需要通过动态染色的能力。因此需要按照一定的规则或逻辑,为每个请求动态生成标签信息。

元数据路由

北极星提供了非常完善的服务治理能力,上层的服务框架基于北极星原生 SDK 就能快速实现强大的服务治理能力。在多测试环境场景下主要用到了元数据路由插件,此插件核心能力是根据请求的标签完全匹配服务实例的标签。

操作指引

具体操作指引按照染色的方式,分为以下三种,可以跳转到对应的文档详细查看: