1.概念

灰度发布涉及4个基础概念。

  • 客户端版本
  • 服务集群
  • 服务版本
  • 服务权重

客户端版本

客户端请求头携带参数version,不同的业务场景,version的取值方式不同。

例如以下场景:

1.用户标签路由

若按照用户标签分组(即用户维度做AB),则version由登陆后返回给前端,前端每次请求都需要在请求头带上这个参数。

2.页面整体AB

对新功能的AB,则可能是前段页面部署2套代码,分别固定取version值,每次请求都添加在请求头中。

服务集群

同一服务可能多地部署,比如洛杉矶和纽约,在洛杉矶的用户只能访问部署在洛杉矶的服务,而在纽约的用户,只能访问在纽约部署的机器。这个具体体现在服务注册中心上,以我们现在使用的nacos为例:

2.灰度发布 - 图1

服务之间的路由访问,只能在集群内访问,不可以跨集群访问。代码配置如下:

2.灰度发布 - 图2

服务版本

服务版本是对统一功能不同实现的表述。比如旧版本的实现为v1,新版本的实现为v2。

在当前的技术体系中,版本信息主要通过服务的元数据区分。以我们现在使用的nacos为例:

2.灰度发布 - 图3

代码中配置如下:

2.灰度发布 - 图4

服务权重

服务权重,主要是对不同性能的机器分配流量的一种策略,权重大的机器,获取的流量大,权重小的机器,获取的流量小。以我们现在使用的nacos为例:

2.灰度发布 - 图5

代码中配置如下:

2.灰度发布 - 图6

2.灰度策略

2.灰度发布 - 图7

备注1:

客户端v1 网关版本V2,服务版本V2,V3

当服务版本版本不存在V1时,会根据客户端走的网关版本进行匹配,即调用服务的V2版本

3.dubbo灰度

利用服务提供者的接口版本实现灰度。

provider

  1. @Slf4j
  2. @RefreshScope
  3. @Api(value = "测试模块111", tags = {"dubbo"})
  4. @RequiredArgsConstructor(onConstructor = @__(@Autowired))
  5. @DubboService(methods = {@Method(name = "echo", timeout = 3000, retries = 0)}, version = "${dubbo.service.com.trendsi.trace.TraceServiceApi.version:1.0.0}")
  6. public class TraceServiceApiImpl implements TraceServiceApi {
  7. @Override
  8. @ApiOperation("/public/echo")
  9. public RemoteResult<EchoDto> echo(EchoQueryDto queryDto) {
  10. List<String> list = new ArrayList<>();
  11. List<List<String>> partition = Lists.partition(list, 100);
  12. for (List<String> strings : partition) {
  13. // TODO
  14. }
  15. EchoDto echoDto = new EchoDto();
  16. echoDto.setContent("----" + queryDto.getName());
  17. return RemoteResult.success(echoDto);
  18. }
  19. }
  1. dubbo.service.com.trendsi.trace.TraceServiceApi.timeout=5000
  2. dubbo.service.com.trendsi.trace.TraceServiceApi.version=1.0.2

推荐在接口上用过${xxx:yyy}的方式设置属性值。

在配置文件中可以通过dubbo.service.xxxxxx.version=xxx的方法设置,方便在做AB,灰度等场景,可通过修改配置,快速切换调用链路。

conusmer

  1. @DubboReference(check = true, version = "${dubbo.reference.org.apache.dubbo.samples.api.DemoService.version:1.0.0}")
  2. private TraceGenericService traceGenericService;
  1. dubbo.reference.org.apache.dubbo.samples.api.DemoService.version=1.0.1

消费端与服务端类似,在@DubboReference上用过${xxx:yyy}的方式设置属性值。在配置文件中可以通过dubbo.reference.xxxxxx.version=xxx的方法设置,方便在做AB,灰度等场景,可通过修改配置,快速切换调用链路。

4.rocketmq 灰度

采用tag的方式进行灰度,即框架会默认新增或修改topic destination的tag

4.1 生产消息�

2.灰度发布 - 图8

4.2 消费消息

2.灰度发布 - 图9

4.3 控制台

2.灰度发布 - 图10

通过tag过滤的消息

符合条件的状态为:CONSUMED

不符合条件的状态为:CONSUMED_BUT_FILTERED

通过消息补发出发的消息,tag过滤功能失效,即消费者即使设置了tag过滤,也会正常消费掉补发的消息。

4.4 上线剩余流量

当上线过程中,有大量mq积压时,根据改写tag过滤会导致mq不能被正常消费,如何解决?

定制前的表示不做过滤,全量消费。定制后,会被改为cluster-version 格式的tag。

框架底层改写时,对-改为为,等效于定制前的

即:- 表示不过滤,全量消费。

5.定时任务灰度

定时任务灰度,框架暂不提供,需要自行实现