微服务引擎 CSE-使用灰度发布:消息灰度
消息灰度
微服务蓝绿或灰度发布的业务场景中,灰度实例生产或消费的消息可能需要特殊处理,这时可以挂载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"]
消息灰度逻辑:
- 消息生产者
- 定时任务生产消息时,如果当前服务实例为灰度实例,那么生产消息时,在消息的属性中增加x_lane_canary: gray标签,如果为基线实例,不作处理。
- 流量触发生产消息时,如果当前流量为灰度流量(即header中含x_lane_canary: gray标签)时,那么生产消息时,在消息的属性中增加x_lane_canary: gray标签,如果为基线,则不作处理。
- 消息消费者
- 构建消息消费者时,如果当前实例为灰度实例(即满足serviceMeta的设置条件)时,消费组增加灰度标识,改为灰度组注册到RocketMq服务端,如原Group为default,那么灰度组为default_gray。
- 在监听消息中修改SubscriptionData中的subString为SQL92语句,从而过滤对应Topic、Group的消息。
- 构建SQL92过滤语句时,支持同一个服务构建RocketMq连接、Topic及Group不同组合的SQL92语句,即同一个服务支持RocketMq连接、Topic及Group不同维度组合下的消息灰度。
- 对于流量生产灰度消息或者消费消息,要结合Sermant的标签透传插件一起使用才能生效。
- 灰度逻辑中出现的灰度标签或消息属性标签信息是根据上述配置内容设置的,业务可以根据需要自定义所需标签。
- 版本要求:
- 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设置的对应标签。