从0到1实现rpc之灰度发布

当发布新版本时,采用灰度发布的方式,把流量逐步发开到新新版本,可以有效保证发版的顺利。

一、灰度标识

  1. 使用特定的符号表示某个实例是否是灰度应用。

在配置信息中添加实例元信息,其中gray为灰度标识,值为true表示灰度版本,值为false表示正式版本。

图片

  1. 参数配置

在代码中使用Map接受服务提供者provider的配置参数。

图片

  1. 添加配置信息到实例元数据中

在服务提供者provider启动过程中读取配置信息,然后添加到元实例的参数中去。

图片

图片

  1. 添加到配置中心

在服务注册的时候,将服务原配置添加到注册中心上去。

图片

  1. 注册成功后,就可以看到每个实例的元信息已经放到配置中心,灰度标识也就完成了。

图片

二、灰度路由

  1. 在服务消费者consumer启动时,会向注册中心抓取服务提供者provider的元信息。

图片

在获取数据过程中,读取节点数据的值,通过反序列化将元信息保存到服务消费者consumer端。

  1. 添加灰度路由
  • 通过构造函数设置灰度流量比例;
  • 通过灰度标识gray识别实例是正常实例,还是灰度实例;
  • 根据灰度比例判断路由逻辑:小于0,表示没有灰度;大于100,表示全是灰度实例。在0-100之间就通过随机数模拟随机灰度,返回灰度节点信息。

图片

  1. 灰度请求

在消费者启动过程中,将灰度路由注册为bean。

图片

在动态代理类中执行时,会先从一堆实例中选择路由,在这里就有可能选择到灰度实例。

图片

三、测试

  1. 启动ZooKeeper作为注册中心。
  2. 使用端口8081,8082,,8083依次启动服务提供者provider。
  3. 在服务消费者consumer端新建立接口,并启动。

图片

  1. 发起请求

这个时候,看到的版本信息都是v1。

图片

  1. 模拟灰度发布

假如业务逻辑发生了变化,版本是v2。

图片

将8081的服务标识为灰度应用。

图片

  1. 再多次发起请求,观察日志。

总共三个实例,灰度应用是8081,正常应用是8082,8083,灰度比例是33%。

图片

在多次请求中,有概率走到灰度应用。

图片

在实际应用中,小流量严重发现没有问题,就会逐步放大灰度比例,热更新灰度应用表示,直到全部转为正式。

源码:

https://github.com/midnight2104/midnight-rpc/tree/lesson10