Skip to content

测试环境路由

lepdou edited this page Nov 22, 2022 · 6 revisions

目录

测试环境路由简介

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

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

此时可以使用测试环境路由的架构来帮助部署一套运维简单且成本较低开发联调环境。测试环境路由是一种基于服务路由的环境治理策略,核心是维护一个稳定的基线环境作为基础环境,测试环境仅需要部署需要变更的微服务。多测试环境有两个基础概念,如下所示:

  1. 基线环境(Baseline Environment): 完整稳定的基础环境,是作为同类型下其他环境流量通路的一个兜底可用环境,用户应该尽量保证基线环境的完整性、稳定性。
  2. 测试环境(Feature Environment): 一种临时环境,仅可能为开发/测试环境类型,测试环境不需要部署全链路完整的服务,而是仅部署本次有变更的服务,其他服务通过服务路由的方式复用基线环境服务资源。

部署完成多测试环境后,开发者可以通过一定的路由规则方式,将测试请求打到不同的测试环境,如果测试环境没有相应的微服务处理链路上的请求,那么会降级到基线环境处理。因此,开发者需要将开发新测试的微服务部署到对应的测试环境,而不需要更新或不属于开发者管理的微服务则复用基线环境的服务,完成对应测试环境的测试。

最典型的示意图如下图所示:

image

快速入门

本章节将介绍如何使用 Spring Cloud Tencent 的多测试环境插件以及流量染色插件快速实现多测试环境路由能力。

完整的 Example 代码请参考: polaris-router-featureenv-example

通过 Spring Cloud Tencent 实现流量的测试环境路由非常简单,核心包含三步:

  1. 服务增加测试环境路由插件依赖
  2. 部署的实例打上环境标签
  3. 为请求流量打上环境标签

第一步:引入 Polaris 服务端

请参考 安装北极星服务端

第二步:所有服务引入多测试环境路由插件

1.7.0 版本新增了多测试环境路由插件,封装了 Spring Cloud Tencent Polaris Router 原子服务路由能力,提供了针对多测试环境的路由支持。以此来最大限度降低用户的使用门槛。

多测试环境路由依赖链路上每一个服务节点的路由能力,所以需要所有服务都增加插件依赖,否则会导致链路断开。

  1. 参考 Spring Cloud Tencent 版本管理 文档获取最新的版本号,引入 Spring Cloud Tencent Bom,例如:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-tencent-dependencies</artifactId>
            <version>1.7.0-Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 引入 Spring Cloud Tencent Discovery Starter & Spring Cloud Tencent FeatureEnv Plugin 依赖
<dependency>
	<groupId>com.tencent.cloud</groupId>
	<artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
</dependency>

<dependency>
	<groupId>com.tencent.cloud</groupId>
	<artifactId>spring-cloud-tencent-featureenv-plugin</artifactId>
</dependency>

第三步:配置 Spring Cloud Tencent 最基本的配置

spring:
  application:
    name: ${application.name}
  cloud:
    polaris:
      address: grpc://${修改为第一步部署的 Polaris 服务地址}:8091
      namespace: default

第四步:服务实例打上环境标签

spring-cloud-tencent-featureenv-plugin 默认以 featureenv 标签作为匹配标签,用户也可以通过系统内置的 system-feature-env-router-label=custom_feature_env_key 标签来指定测试环境路由使用的标签键。以下三种方式以默认的 featureenv 作为示例。

方式一:配置文件

在服务实例的配置文件中添加配置,如在 application.yml 添加如下所示即可:

spring:
  cloud:
    tencent:
      metadata:
        content:
          featureenv: f1  # f1 替换为测试环境名称

方式二:环境变量

在服务实例所在的操作系统中添加环境变量也可进行打标,例如:SCT_METADATA_CONTENT_featureenv=f1

方式三:SPI 方式

自定义实现 InstanceMetadataProvider#getMetadata() 方法的返回值里里包含 featureenv 即可。

基线环境标签值

注意,基线环境部署的服务实例不需要设置 featureenv 标签,表明其不属于任何测试环境,才可在请求没有匹配到对应测试环境的时候,匹配到基线环境。

第五步:流量染色

方式一:客户端染色

如下图所示,在客户端发出的 HTTP 请求里,新增 X-Polaris-Metadata-Transitive-featureenv=f1 请求头即可实现染色。该方式是让开发者在请求创建的时候根据业务逻辑进行流量染色。

image (1)

方式二:网关动态染色

动态染色是开发者配置一定的染色规则,让流量经过网关时自动染色,使用起来相当方便。例如把 uid=1 用户的请求都转发到 f1 环境,把 uid=0 用户的请求都转发到 f2 环境。只需要配置一条染色规则即可实现。

image (2)

Spring Cloud Tencent 通过实现 Spring Cloud Gateway 的 GlobalFilter 来实现流量染色插件,开发者只需要添加 spring-cloud-tencent-gateway-plugin 依赖,并在配置文件中打开染色插件开关(spring.cloud.tencent.plugin.scg.staining.enabled=true)即可引入流量染色能力。

完成以上操作步骤即可实现测试环境路由,可运行 Spring Cloud Tencentpolaris-router-featureenv-example 完整体验。

Clone this wiki locally