从0到1实现rpc之灰度发布
07 Apr 2024 |当发布新版本时,采用灰度发布的方式,把流量逐步发开到新新版本,可以有效保证发版的顺利。
一、灰度标识
- 使用特定的符号表示某个实例是否是灰度应用。
在配置信息中添加实例元信息,其中gray为灰度标识,值为true表示灰度版本,值为false表示正式版本。
- 参数配置
在代码中使用Map接受服务提供者provider的配置参数。
- 添加配置信息到实例元数据中
在服务提供者provider启动过程中读取配置信息,然后添加到元实例的参数中去。
- 添加到配置中心
在服务注册的时候,将服务原配置添加到注册中心上去。
- 注册成功后,就可以看到每个实例的元信息已经放到配置中心,灰度标识也就完成了。
二、灰度路由
- 在服务消费者consumer启动时,会向注册中心抓取服务提供者provider的元信息。
在获取数据过程中,读取节点数据的值,通过反序列化将元信息保存到服务消费者consumer端。
- 添加灰度路由
- 通过构造函数设置灰度流量比例;
- 通过灰度标识gray识别实例是正常实例,还是灰度实例;
- 根据灰度比例判断路由逻辑:小于0,表示没有灰度;大于100,表示全是灰度实例。在0-100之间就通过随机数模拟随机灰度,返回灰度节点信息。
- 灰度请求
在消费者启动过程中,将灰度路由注册为bean。
在动态代理类中执行时,会先从一堆实例中选择路由,在这里就有可能选择到灰度实例。
三、测试
- 启动ZooKeeper作为注册中心。
- 使用端口8081,8082,,8083依次启动服务提供者provider。
- 在服务消费者consumer端新建立接口,并启动。
- 发起请求
这个时候,看到的版本信息都是v1。
- 模拟灰度发布
假如业务逻辑发生了变化,版本是v2。
将8081的服务标识为灰度应用。
- 再多次发起请求,观察日志。
总共三个实例,灰度应用是8081,正常应用是8082,8083,灰度比例是33%。
在多次请求中,有概率走到灰度应用。
在实际应用中,小流量严重发现没有问题,就会逐步放大灰度比例,热更新灰度应用表示,直到全部转为正式。
源码:
https://github.com/midnight2104/midnight-rpc/tree/lesson10