本文介绍如何在Serverless应用引擎SAE(Serverless App Engine)上基于阿里云消息队列RocketMQ版实现环境隔离,您可以在不修改任何业务代码的情况下,实现异步场景下的流量控制。
背景信息
- 支持RocketMQ版本:4.2.0及以上版本。
- 支持Pull和Push两种模式。
- 需要在服务端配置
enablePropertyFilter=true
并重启服务端。
准备工作
部署SAE Demo应用
-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消息灰度。
步骤二:引入流量并进行验证
Demo应用的结构图如下,应用之间的调用,既包含了Spring Cloud的调用,也包含了Dubbo的调用,覆盖了当前市面上最常用的两种微服务框架。其中C应用会生产出RocketMQ消息,由A应用进行消费,A应用在消费消息时,也会发起新的调用。这些应用都是基础的Spring Cloud、Dubbo和RocketMQ的标准用法。
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)环境中。具体操作,请参见查看实时日志。