网关静态染色

流程简介

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

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

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

网关静态染色 - 图1

操作指引

阶段一

微服务框架服务注册场景

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 元数据使用说明网关静态染色 - 图2 (opens new window)

  • 方式一:配置文件

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

  1. spring:
  2. cloud:
  3. tencent:
  4. metadata:
  5. content:
  6. featureenv: f1 # f1 替换为测试环境名称
  • 方式二:环境变量

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

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

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

kubernetes服务注册场景

北极星提供了polaris-controller网关静态染色 - 图3 (opens new window),支持直接将pod labels同步为北极星上面的实例标签。

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. labels:
  6. app: nginx
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: nginx
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx
  16. spec:
  17. containers:
  18. - name: nginx
  19. image: nginx:1.14.2
  20. ports:
  21. - containerPort: 80

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

阶段二

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

阶段三

往请求中加入固定的 Header 是网关最常见的插件,如上图所示。可以在每个环境部署一个网关,所有经过网关的请求都增加 X-Polaris-Metadata-Transitive-featureenv=f1 请求头(其中,f1替换为对应的测试环境标签)即可。

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

Spring Cloud Tencent 静态染色

在 Spring Cloud 项目中,可以利用 Spring Cloud Gateway 提供的一些方式来帮助实现流量的静态染色,如下所示。所有经过该网关的流量,都在经过的 HTTP 请求的头部自动打上 X-Polaris-Metadata-Transitive-featureenv=f1 的数据标签。

  1. 配置文件方式添加 HTTP 请求头部

开发者可以在配置文件中,为每一个需要进行流量染色的服务,添加 Spring Cloud Gateway 提供的内置 filter 规则来实现流量染色的 HTTP 请求头部的添加。

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: add_request_header_route
  6. uri: lb://NAME_OF_SERVICE
  7. filters:
  8. - AddRequestHeader=X-Polaris-Metadata-Transitive-featureenv, f1

具体文档参考:The AddRequestHeader GatewayFilter Factory网关静态染色 - 图6 (opens new window)

  1. 代码方式添加 HTTP 请求头部

开发者也可以实现 Spring Cloud Gateway 提供的 GlobalFilter 接口,直接为所有经过网关应用的请求添加流量染色的 HTTP 请求头部。

  1. @Component
  2. public class CustomGlobalFilter implements GlobalFilter {
  3. @Override
  4. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  5. // get request builder
  6. ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
  7. try {
  8. builder.header("X-Polaris-Metadata-Transitive-featureenv", URLEncoder.encode("f1", UTF_8));
  9. }
  10. catch (UnsupportedEncodingException e) {
  11. builder.header("X-Polaris-Metadata-Transitive-featureenv", "f1");
  12. }
  13. return chain.filter(exchange.mutate().request(builder.build()).build());
  14. }
  15. }