网关动态染色

流程简介

如概述所言,测试环境路由的开发工作分为三个阶段:

  • 阶段一:实例打标。在多测试环境的场景中,需要对每个测试环境部署的实例进行区分,因此需要在实例上打类似标识实例测试环境类别的标签。
  • 阶段二:部署应用。
  • 阶段三:流量染色。流量染色即为每个请求打上目标测试环境标签,路由转发时根据请求标签匹配请求。

如下图所示,开发者给每个环境的应用实例进行打标(如 featureenv=f1 ),标明其所在的环境类型。阶段二部署业务应用。阶段三中,开发者在网关添加动态流量染色规则来给每个请求添加相应的流量标签,即可完成测试环境路由。

操作指引

阶段一

微服务框架服务注册场景

Spring Cloud Tencent 框架接入

Spring Cloud Tencent 中的 spring-cloud-tencent-featureenv-plugin 模块闭环了测试环境路由全部能力,所有服务只需要添加该依赖即可引入测试环境路由能力。spring-cloud-tencent-featureenv-plugin 默认以 featureenv 标签作为匹配标签,用户也可以通过系统内置的 system-feature-env-router-label=custom_feature_env_key 标签来指定测试环境路由使用的标签键。以下三种方式以默认的 featureenv 作为示例。设置方式详情参考Spring Cloud Tencent 元数据使用说明

  • 方式一:配置文件

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

spring:
  cloud:
    tencent:
      metadata:
        content:
          featureenv: f1  # f1 替换为测试环境名称
  • 方式二:环境变量

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

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

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

kubernetes服务注册场景

北极星提供了polaris-controller,支持直接将pod labels同步为北极星上面的实例标签。

  • 在集群中安装polaris-controller,安装方式可参考:安装指南
  • 创建deployment的时候,通过template配置,指定pod的标签信息,详细参考:标签指定
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

做完上面2步后,polaris-controller默认会对集群中的服务数据进行全量同步,而pod中的labels也会同步为北极星的实例标签。

阶段二

在 VM 或者容器中部署业务应用,需要保证业务应用与北极星服务治理中心的网络连通性。

阶段三

网关动态染色是开发者配置一定的染色规则,让流量经过网关时自动染色。例如上图红框内所示,把 uid=1 用户的请求都转发到 f1 环境,把 uid=0 用户的请求都转发到 f2 环境。具体的流程是开发者在北极星的页面上添加类似如下图所示的染色规则,然后网关根据染色规则在 HTTP 请求里,新增 X-Polaris-Metadata-Transitive-featureenv=f1 请求头即可实现流量染色。

请求头 X-Polaris-Metadata-Transitive-featureenv=f1 是按照北极星定义的请求头格式设置的,其中 X-Polaris-Metadata-Transitive- 是北极星需要读取请求头的前缀,例子中的 featureenv 为实际的键值对的key,f1 为实际的键值对的value。

操作步骤:

  1. 创建配置文件 rule/staining.json

  1. 编辑 rule/staining.json 并应用SCG染色模板(SCG染色模版将在1.11.0版本提供,目前仅支持自定义编写)。

  1. 保存并发布,该规则配置将下发到对应的SCG应用,后续 HTTP 请求将按照规则进行染色,并根据染色标签路由到不同的测试环境,以实现测试环境路由。

模版里的样例配置的含义是,在 HTTP 请求的参数中拿到 uid 字段,如果等于(EQUAL10001,那么就在经过的 HTTP 请求的头部自动打上 X-Polaris-Metadata-Transitive-featureenv=feature1 的数据标签。更加详细的规则配置说明如下所示:

配置项 配置项说明 类型 备注
rules 动态染色规则列表 list
conditions 规则匹配条件列表 list
conditions内项 规则匹配条件 map
conditions内项.key 规则匹配条件原始值 string ${http.query.xxx}
${http.header.xxx}
${http.cookie.xxx}
${http.method}
${http.uri}
conditions内项.values 规则匹配条件目标值列表 list
conditions内项.operation 规则匹配条件操作符 string EQUALS
NOT_EQUALS
IN
NOT_IN
REGEX
BLANK
NOT_BLANK
labels 染色标签列表 list
labels内项 染色标签 map
labels内项.key 染色标签key string
labels内项.value 染色标签value list

Spring Cloud Tencent 实现方式

Spring Cloud Tencent 通过实现 Spring Cloud Gateway 的 GlobalFilter 来实现流量染色插件,开发者只需要添加 spring-cloud-tencent-gateway-plugin 依赖,并在配置文件打开如下所示的染色插件开关即可引入流量染色能力。spring-cloud-tencent-gateway-plugin 插件会默认读取北极星配置中心内的 rule/staining.json 配置作为动态染色规则。

spring-cloud-tencent-gateway-plugin 配置列表:

配置项Key 默认值 是否必填 配置项说明
spring.cloud.tencent.plugin.scg.enabled true 是否开启网关插件
spring.cloud.tencent.plugin.scg.staining false 是否开启网关染色
spring.cloud.tencent.plugin.scg.staining.rule-staining.enabled true 是否开启网关动态规则染色
spring.cloud.tencent.plugin.scg.staining.rule-staining.namespace ${spring.cloud.tencent.namespace:default} 网关动态规则命名空间
spring.cloud.tencent.plugin.scg.staining.rule-staining.group ${spring.application.name:spring-cloud-gateway} 网关动态规则配置分组
spring.cloud.tencent.plugin.scg.staining.rule-staining.fileName rule/staining.json 网关动态规则文件名