通过上面描述,我们理解了什么是灰度发布,接下来我们基于Dubbo实现灰度发布。Dubbo的灰度发布常见的方式有版本控制灰度发布、路由灰度发布、基于Apollo实现灰度发布,我们把这每种灰度发布都实现一次。
在学习Dubbo灰度发布之前,我们先看准备好的案例工程,如下图:
Dubbo版本控制灰度发布
如上图,我们对每个工程做个分析:
dubbo-provider-v1: 版本号为 1.0.0
dubbo:
provider: protocol: dubbo version: 1.0.0 timeout: 3000
dubbo-provider-v2: 版本号为 2.0.0
dubbo:
provider: protocol: dubbo version: 2.0.0 timeout: 3000
要实现不同版本的切换,我们可以根据url路径来实现,现实项目中,可以根据用户名或者IP选择调用不 同版本的服务端,当测试版本稳定后,直接将消费端全局版本调整至 2.0.0即可。
dubbo-consumer:默认使用的版本是 1.0.0
控制层调用如下:
测试效果如下:http://localhost:18082/car/v1/byd
Version1-比亚迪 唐 白色 车牌:byd
测试效果如下:http://localhost:18082/car/v2/byd
Version1-比亚迪 唐 白色 车牌:byd
Dubbo权重灰度发布
灰度发布主要目的是让少量用户测试新版本,我们可以将少部分流量引入到 dubbo-provider-v2中,此 时我们可以给 dubbo-provider-v2设置权重比例。
权重参数如下:
# 局部设置可以覆盖掉全局设置对当前局部设置进行修改的远程调用接口的设置
#
# loadbalance 设置负载均衡的方式(局部设置负载均衡):
# random:RandomLoadBalance:权重随机调用(dubbo中默认使用的方式)
# 如果服务多实例权重相同,则进行随机调用;如果权重不同,按照总权重取随机数
# roundrobin:RoundRobinLoadBalance:权重轮询调度算法
# 若权重相同则直接取模调用服务,循环调用多个服务,若权重不相同则根据权重的大小循环调用服务
# leastactive:LeastActiveLoadBalance:最少活跃次数
# 取出多个实例中被调用的次数最少的实例,如果只有一个则调用其,多个且权重相同则随机返回,权重不同则通过总权重随机调用
# consistenthash:ConsistentHashLoadBalance:一致性hash
# 相同参数的请求总是发到同一提供者
# 如果当前接收请求的提供者挂掉时,会将发往其的请求平摊到其它提供者
# 也可以在application配置文件中配置 dubbo.consumer.loadbalance=
#
#
# cluster 设置dubbo集群容错机制(局部设置):
# failover:失败自动切换,当出现失败时重试其它服务器,通常用于读操作,但重试会带来更长延迟。可通过retries="2" 来设置重试次数(2中不包含第一次)。
# failfast:快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作,比如新增记录
# failsafe:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作
# failback:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
# forking:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
# broadcast:广播调用所有提供者,逐个调用,任意一台报错则报错 。通常用于通知所有提供者更新缓存或日志等本地资源信息# 可以在application配置文件中配置 dubbo.consumer.cluster= retries=
全局配置可以在application.yml中配置:
dubbo: registry: address: zookeeper://127.0.0.1:2181
consumer: # 全局性设置负载均衡方式 loadbalance: random version: 1.0.0 cluster: failfast
如果是单独配置某一个被注入的对象:
@Reference(loadbalance = "roundrobin")
private CarService carService;
Apollo灰度发布
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。
Dubbo基于Apollo配置管理
我们先使用Apollo实现项目配置,此案创建三个项目 common:公共配置
provider:生产者配置
consumer:消费者配置
Dubbo基于Apollo灰度发布
通过创建灰度版本,您可以对某些配置做灰度测试 灰度流程为:
- 创建灰度版本
- 配置灰度配置项
- 配置灰度规则.如果是私有的namespace可以按照客户端的IP进行灰度,如果是公共的namespace则可 以同时按AppId和客户端的IP进行灰度
- 灰度发布
灰度版本最终有两种结果:全量发布和放弃灰度 全量发布:灰度的配置合到主版本并发布,所有的客户端 都会使用合并后的配置 放弃灰度:删除灰度版本,所有的客户端都会使用回主版本的配置 注意事项: 1.如 果灰度版本已经有灰度发布过,那么修改灰度规则后,无需再次灰度发布就立即生效
灰度配置
如下图,如果测试版本有额外的配置,我们可以点击新增灰度配置
新增配置后,点击灰度发布才会生效
灰度规则配置
我们可以让指定的IP的服务为灰度版本,如下图可以选择当前访问过服务的IP,如果有其他指定IP,可 以手动直接输入,手动输入多个IP以逗号隔开,当用户访问这些IP指定的服务时,对应配置才会生效。
手动输入IP
全量灰度发布
全量灰度发布在现实工作中是指灰度版本没有问题了,需要把所有服务的版本全部切换成完成测试的灰 度版本,我们点击全量发布即可,全量发布的时候,我们可以把灰度版本删除。