1.概念
灰度发布涉及4个基础概念。
- 客户端版本
- 服务集群
- 服务版本
- 服务权重
客户端版本
客户端请求头携带参数version,不同的业务场景,version的取值方式不同。
例如以下场景:
1.用户标签路由
若按照用户标签分组(即用户维度做AB),则version由登陆后返回给前端,前端每次请求都需要在请求头带上这个参数。
2.页面整体AB
对新功能的AB,则可能是前段页面部署2套代码,分别固定取version值,每次请求都添加在请求头中。
服务集群
同一服务可能多地部署,比如洛杉矶和纽约,在洛杉矶的用户只能访问部署在洛杉矶的服务,而在纽约的用户,只能访问在纽约部署的机器。这个具体体现在服务注册中心上,以我们现在使用的nacos为例:
服务之间的路由访问,只能在集群内访问,不可以跨集群访问。代码配置如下:
服务版本
服务版本是对统一功能不同实现的表述。比如旧版本的实现为v1,新版本的实现为v2。
在当前的技术体系中,版本信息主要通过服务的元数据区分。以我们现在使用的nacos为例:
代码中配置如下:
服务权重
服务权重,主要是对不同性能的机器分配流量的一种策略,权重大的机器,获取的流量大,权重小的机器,获取的流量小。以我们现在使用的nacos为例:
代码中配置如下:
2.灰度策略
备注1:
客户端v1 网关版本V2,服务版本V2,V3
当服务版本版本不存在V1时,会根据客户端走的网关版本进行匹配,即调用服务的V2版本
3.dubbo灰度
利用服务提供者的接口版本实现灰度。
provider
@Slf4j
@RefreshScope
@Api(value = "测试模块111", tags = {"dubbo"})
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@DubboService(methods = {@Method(name = "echo", timeout = 3000, retries = 0)}, version = "${dubbo.service.com.trendsi.trace.TraceServiceApi.version:1.0.0}")
public class TraceServiceApiImpl implements TraceServiceApi {
@Override
@ApiOperation("/public/echo")
public RemoteResult<EchoDto> echo(EchoQueryDto queryDto) {
List<String> list = new ArrayList<>();
List<List<String>> partition = Lists.partition(list, 100);
for (List<String> strings : partition) {
// TODO
}
EchoDto echoDto = new EchoDto();
echoDto.setContent("----" + queryDto.getName());
return RemoteResult.success(echoDto);
}
}
dubbo.service.com.trendsi.trace.TraceServiceApi.timeout=5000
dubbo.service.com.trendsi.trace.TraceServiceApi.version=1.0.2
推荐在接口上用过${xxx:yyy}的方式设置属性值。
在配置文件中可以通过dubbo.service.xxxxxx.version=xxx的方法设置,方便在做AB,灰度等场景,可通过修改配置,快速切换调用链路。
conusmer
@DubboReference(check = true, version = "${dubbo.reference.org.apache.dubbo.samples.api.DemoService.version:1.0.0}")
private TraceGenericService traceGenericService;
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 生产消息�
4.2 消费消息
4.3 控制台
通过tag过滤的消息
符合条件的状态为:CONSUMED
不符合条件的状态为:CONSUMED_BUT_FILTERED
通过消息补发出发的消息,tag过滤功能失效,即消费者即使设置了tag过滤,也会正常消费掉补发的消息。
4.4 上线剩余流量
当上线过程中,有大量mq积压时,根据改写tag过滤会导致mq不能被正常消费,如何解决?
定制前的表示不做过滤,全量消费。定制后,会被改为cluster-version 格式的tag。
框架底层改写时,对-改为为,等效于定制前的
即:- 表示不过滤,全量消费。
5.定时任务灰度
定时任务灰度,框架暂不提供,需要自行实现