更新时间:2025-01-07 GMT+08:00
分享

使用灰度发布

流量灰度

为保障新特性平稳上线,可以先选择少部分用户试用,待新特性成熟以后,再让所有用户使用。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以减少其影响。

基于Servicecomb Java Chassis和Spring Cloud Huawei框架注册到ServiceComb引擎的微服务,使用灰度功能只需通过配置下发即可使用。

Servicecomb Java Chassis依赖handler-router和Spring Cloud Huawei依赖spring-cloud-starter-huawei-router实现微服务灰度能力,下发规则遵守如下规范:

servicecomb:
    routeRule:  
      provider: | #服务名
        - precedence: 2 #优先级
          match:        #匹配策略
            headers:          #header匹配
              region:            
                exact: 'providerRegion'

              type:         
                exact: gray
          route: #路由规则
            - weight: 100 #权重值
              tags:
                version: 1.0.0
              
        - precedence: 1
          route:
            - weight: 20
              tags:
                version: 0.0.1
                canaryProperty: group-a
            - weight: 80
              tags:
                version: 0.0.2

上述配置的具体含义如下:

  • 匹配特定请求由match配置,匹配条件是headers。headers中的字段的匹配支持精准匹配。如果未定义match,则可匹配任何请求。
  • 转发权重定义在routeRule.{targetServiceName}.route下,由weight配置,weight数值表示百分数,需要满足加和等于100,不满足100的部分会用最新版本填充。
  • 服务分组定义在routeRule.{targetServiceName}.route下,由tags配置,version是特殊的tag,表示微服务版本。还可以配置其他属性,这些属性在实例的属性里面定义。
  • 优先级数量越大优先级越高。

Servicecomb Java Chassis依赖darklaunch实现的微服务灰度能力,也是当前ServiceComb引擎页面下发的规则,遵守如下规范:

{
  "policyType":"RULE",
  "ruleItems":[
    {
      "groupName":"self_rule_test",
      "groupCondition":"version=0.0.1",
      "policyCondition":"name=11111",
      "versions":["0.0.1"]
     }],
   "empty":false
}

上述配置的具体含义如下:

  • policyCondition路由规则匹配条件,本条规则匹配的是请求参数为name,值为11111时匹配当前路由规则。
  • groupName路由规则名称。
  • groupCondition规则的目标分组,本条路由规则在匹配到name=11111的条件下,路由到version=0.0.1的微服务实例。
  • 配置项固定为:cse.darklaunch.policy.${serviceName}。

Spring Cloud Huawei

Spring Cloud Huawei使用灰度发布,需要在项目中增加如下依赖。如果项目中已经直接或者间接引入依赖,无需重复引入。

<dependency>
  <groupId>com.huaweicloud</groupId>
  <artifactId>spring-cloud-starter-huawei-router</artifactId>
</dependency>

灰度规则依赖的headers参数设置:

  • 1.10.7及之后版本header参数需要在配置文件中设置,用户请求当中的header不会透传到下游服务:
    spring:
      cloud:
        servicecomb:
          context:
            headerContextMapper:
              canary: canary
  • 1.10.7之前的版本设置header参数:请求中设置的header参数进行透传。

Java Chassis

Java Chassis使用灰度发布,需要在项目中增加如下依赖。如果项目中已经直接或者间接引入依赖,无需重复引入。

<dependency>
  <groupId>org.apache.servicecomb</groupId>
  <artifactId>handler-router</artifactId>
</dependency>

或者

<dependency>
    <groupId>org.apache.servicecomb</groupId>
    <artifactId>darklaunch</artifactId>
</dependency>

并在配置文件中增加配置项:

servicecomb.router.type: router

Java Chassis默认不会传递非参数header到各个微服务,如果灰度发布依赖于非参数header,可以增加如下配置项:

servicecomb.router.header: canaryHeader1,canaryHeader2

Java Chassis会将这些非参数header用于灰度发布的匹配。

如果请求经过Edge Service转发,Edge Service也需要增加灰度发布相关的配置。

消息灰度

微服务蓝绿或灰度发布的业务场景中,灰度实例生产或消费的消息可能需要特殊处理,这时可以挂载Sermant消息灰度插件实现消息的灰度能力,灰度实例生产者或灰度流量生产灰度消息,灰度消费者消费灰度消息。

  • 消息灰度配置:
    • 配置项:grayscale.mq.config
    • 作用范围:app=${service.meta.application}&environment=${service.meta.environment},即应用配置。service.meta.application、service.meta.environment的配置,默认为app=default&environment=
    • 配置内容:
      # 消息灰度插件开启开关,默认为false不开启
      enabled: false
      # 灰度组信息集合,每个灰度组包含consumerGroupTag(灰度组标识)、serviceMeta(微服务实例属性标签)及trafficTag(流量标签)。
      grayscale:
        # 灰度组标签,例如基线消费组名称为basic_group,那么灰度名称为basic_group_${consumerGroupTag}
        - consumerGroupTag: gray
          serviceMeta:
            # ServiceMeta匹配标签,如果服务启动时service_meta_parameters设置为x_lane_tag:gray,那么当前消费者为灰度节点。
            # 如果通过service_meta_version设置匹配信息,配置中的key一定要是'version',像version:1.0.1。
            x_lane_tag: gray
            version: 1.0.1
          trafficTag:
            # 流量标签匹配,配合sermant-tag-transmission插件一起生效,如果请求header中包含x_lane_canary=gray,并且开启标签透传插件,设置配置
            # tag.transmission.config.matchRule.exact: ['x_lane_canary'],这时生产的消息为灰度消息.
            x_lane_canary: gray
          # serviceMeta与trafficTag关系如下:
          # 如果服务启动是service_meta_parameters设置信息x_lane_tag:gray,那么匹配为灰度实例。
          #   1、如果是生产者,那么消息的property中设置属性'x_lane_canary: gray'标识为灰度消息。
          #   2、如果是消费者,仅消费property包含'x_lane_canary: gray'属性的消息。
      # 基线消费组信息定义
      base:
        # 基线消费者消费消息模式,包含BASE/AUTO两个模式,默认值为AUTO模式
        # BASE模式消费除excludeGroupTags设置的消费组标识以外的消息
        # AUTO模式除excludeGroupTags设置的消费组标识及正在运行的灰度组以外的消息
        consumeMode: AUTO
        # auto模式下,基线消费者定期检查灰度消费者时间间隔
        autoCheckDelayTime: 15
        # 基线消费者默认剔除的灰度组标识,对应上面consumerGroupTag设置的值,auto/base模式都会生效
        excludeGroupTags: ["gray"]
  • 消息灰度逻辑:
    • 消息生产者
      1. 定时任务生产消息时,如果当前服务实例为灰度实例,那么生产消息时,在消息的属性中增加x_lane_canary: gray标签,如果为基线实例,不作处理。
      2. 流量触发生产消息时,如果当前流量为灰度流量(即header中含x_lane_canary: gray标签)时,那么生产消息时,在消息的属性中增加x_lane_canary: gray标签,如果为基线,则不作处理。
    • 消息消费者
      1. 构建消息消费者时,如果当前实例为灰度实例(即满足serviceMeta的设置条件)时,消费组增加灰度标识,改为灰度组注册到RocketMq服务端,如原Group为default,那么灰度组为default_gray。
      2. 在监听消息中修改SubscriptionData中的subString为SQL92语句,从而过滤对应Topic、Group的消息。
      3. 构建SQL92过滤语句时,支持同一个服务构建RocketMq连接、Topic及Group不同组合的SQL92语句,即同一个服务支持RocketMq连接、Topic及Group不同维度组合下的消息灰度。
  1. 对于流量生产灰度消息或者消费消息,要结合Sermant的标签透传插件一起使用才能生效。
  2. 灰度逻辑中出现的灰度标签或消息属性标签信息是根据上述配置内容设置的,业务可以根据需要自定义所需标签。
  3. 版本要求:
    • sermant-agent版本要求大于等于2.1.3。
    • RocketMq客户端版本:大于4.8.0。
    • RocketMq服务端需要支持开启消息过滤能力。

根据消息进行灰度路由调用。

很多业务场景中,在消费到消息后根据消息内容调用下游服务处理相应的业务,如果消费的是灰度消息,那么我们应该要调用下游对应的灰度实例去处理业务,反之调用基线实例处理业务,该能力需要结合标签透传插件并触发消息getBody方法才能生效。

Sermant的流量灰度可以参考Spring Cloud应用实现全链路灰度实现。

标签透传插件配置:

  • 配置项:tag-config
  • 作用范围:自定义标签配置group:sermant.tag-transmission-plugin
  • 配置内容:
    enabled: true
    matchRule:
      exact: ["x_lane_canary"]

    x_lane_canary标签为上述消息灰度配置中trafficTag设置的对应标签。

相关文档