本文介绍如何在Serverless应用引擎SAE(Serverless App Engine)上基于阿里云消息队列RocketMQ版实现环境隔离,您可以在不修改任何业务代码的情况下,实现异步场景下的流量控制。

背景信息

dg_rocket_mq_workflow
  • 支持RocketMQ版本:4.2.0及以上版本。
  • 支持Pull和Push两种模式。
  • 需要在服务端配置enablePropertyFilter=true并重启服务端。

准备工作

部署SAE Demo应用

  1. 下载Demo
  2. 部署主干链路应用。
    部署主干链路应用(A、B、C)。具体操作,请参见将Spring Cloud应用托管到SAE
  3. 部署灰度链路应用(A-gray、B-gray、C-gray),在启动命令中添加启动参数-Dalicloud.service.tag=gray用于区别主干链路应用。
说明 部署时,如果需要使用独立的注册中心,需要添加启动参数-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false

部署RocketMQ

  • 消息的生产者和消息的消费者,需要同时开启RocketMQ消息灰度,消息的灰度功能才能生效。消息类型目前只支持RocketMQ,包含开源版本(Apache RocketMQ)和阿里云商业版(消息队列RocketMQ版)。
    • 如果您使用开源RocketMQ,则RocketMQ Server和RocketMQ Client都需要使用4.5.0及以上版本。更多信息,请参见Apache RocketMQ
    • 如果您使用阿里云消息队列RocketMQ版,需要使用铂金版,且Ons Client使用1.8.0.Final及以上版本。更多信息,请参见快速入门概述
  • 开启RocketMQ消息灰度后,消息的Consumer Group会被修改。例如原来的Consumer Group为group1,环境标签为gray,开启RocketMQ消息灰度后,则group会被修改成group1_gray,如果您使用的是阿里云消息队列RocketMQ版 ,请提前创建好Group。
  • 默认使用SQL92的过滤方式,如果您使用开源RocketMQ,需要在服务端开启SQL92过滤功能(即在broker.conf中配置enablePropertyFilter=true)。

步骤一:为应用开启RocketMQ消息灰度

Demo中的spring-cloud-c、spring-cloud-a应用分别为消息的生产者和消费者,通过添加启动参数-Dprofiler.micro.service.mq.gray.enable=true,在SAE上为其开启RocketMQ消息灰度。

说明 RocketMQ消息灰度功能的开启和关闭,需要在SAE控制台重新部署应用后才能生效。

步骤二:引入流量并进行验证

Demo应用的结构图如下,应用之间的调用,既包含了Spring Cloud的调用,也包含了Dubbo的调用,覆盖了当前市面上最常用的两种微服务框架。其中C应用会生产出RocketMQ消息,由A应用进行消费,A应用在消费消息时,也会发起新的调用。这些应用都是基础的Spring Cloud、Dubbo和RocketMQ的标准用法。

dg_implement_end_to_end_canary_release_via_rocket_mq

Demo的调用链路为:spring-cloud-zuul应用在收到/A/dubbo的请求时,会把请求转发给spring-cloud-a,然后spring-cloud-a通过Dubbo协议去访问spring-cloud-b,spring-cloud-b也通过Dubbo协议去访问spring-cloud-c,spring-cloud-c在收到请求后,会生产一个消息,并返回自己的环境标签和IP地址。这些生产出来的消息会由spring-cloud-a应用消费,spring-cloud-a应用在消费消息的时候,会通过spring cloud去调用spring-cloud-b,spring-cloud-b进而通过spring cloud去调用spring-cloud-c,并且将结果输出到自己的日志中。

#访问/A/dubbo的时候
#返回值为A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]
#同时,A应用在接收到消息之后,输出的日志如下:
c.a.mse.demo.service.MqConsumer: topic:TEST_MQ,producer:C[10.25.xx.xx],invoke result:A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]

您可以登录SAE控制台,查看spring-cloud-a应用的日志并验证配置。基线环境可以同时消费灰度(gray)和基线(base)环境生产出来的消息,而且在消费对应环境消息时产生的Spring Cloud调用分别路由到灰度(gray)和基线(base)环境中。具体操作,请参见查看实时日志