十一、服务灰度发布

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test 就是一种灰度发布方式:让一部分用户继续用 A,一部分用户开始用 B;如果用户对 B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到 B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

1 服务灰度发布流程设计

服务灰度发布的主要作用如下:

  1. 解决服务升级不兼容问题。
  2. 及早获得用户的意见反馈,完善产品功能,提升服务质量。
  3. 缩小服务升级所影响的用户范围,降低升级风险。
  4. 让用户及早参与产品测试,加强用户互动。

1.1 灰度环境准备

  1. 系统运维人员通过管理员账号登录灰度发布 Portal或者进入服务治理的灰度发布界面。
  2. 在生产环境中圈定本轮灰度发布的范围,它通常是一个应用集群,包括前后台服务,当然可能是单个服务。
  3. 将选择的服务灰度发布范围信息保存到服务注册中心,用于后续的规则下发和灰度升级历史记录查询等。
  4. 通知灰度升级查询内的服务实例下线,通常会采用优雅停机的方式让待升级的服务下线,保证升级不中断业务。
  5. 应用金城接收到优雅停机指令后,将本进程内缓存的消息处理完,然后优雅退出。
  6. 从软件仓库选择需要升级的服务安装镜像包,用于灰度环境的版本升级。
  7. 将升级包批量上传到灰度环境中,把原来的业务软件包做本地备份之后,升级服务版本。
  8. 灰度环境升级部署成功之后,返回灰度环境部署成功消息给灰度发布管理控制台,然后进行后续的灰度发布操作。

1.2 灰度规则设置

灰度环境准备完成之后,运维人员对灰度规则进行配置,灰度规则主要用于服务路由。
按照规则的不同,部分用户将调用老的服务,另一部分用户则会调用灰度环境中新发布的服务,常用的灰度规则分类如下:

  1. 按照接入门户类型分类,例如网上营业厅、手机客户端、营业厅实体店、自主业务办理终端等。
  2. 按照终端类型分类,例如 Android、IOS、Windows Phone 等。
  3. 按照区域进行划分,例如东北、华北、华中等。
  4. 其它策略。

1.3 灰度规则下发

灰度规则设置完成之后,需要将规则下发给参与消费路由的软负载均衡器 SLB、Web前台和后台服务,它的处理流程如下图:

灰度规则下发,主要由服务注册中心负责推送,推送的目标包括前端的 SLB负载均衡器、Web 前台集群和 App 后台服务集群,各节点将灰度规则缓存到本地内存中;消息或者服务路由时,通过路由插件解析灰度规则,将消息路由到指定到服务版本中。需要指出的是,灰度规则的通知范围是整个生产环境集群,包括灰度发布环境和非灰度生产环境。

1.4 灰度路由

通过 SLB定制的灰度发布插件,可以将 HTTP消息按照规则分发到不同的 Web前台;Web前台根据内置的服务框架 SDK,通过客户端灰度路由插件,解析灰度规则,将服务路由到灰度或者非灰度环境,实现服务的灰度路由。
灰度路由的流程如下图:

需要指出的是,如果灰度规则解析失败,实际上就无法区分哪些服务应该路由到灰度环境,这种场景下比较合适的做法就是将服务路由到非灰度环境。如果服务提供者无法处理或者处理失败,则需要对灰度发布做回退处理,并通知所有受影响的服务消费者。

1.5 失败回滚

失败回滚的流程如下:

1.6 灰度发布总结

灰度发布之后,需要对灰度发布之后的服务运行和运营情况进行分析,包括服务调用来源分析、服务性能 KPI数据、用户行为分析报告、用户问卷调查等,通过对这些数据进行分析来改进服务功能,完善产品,为新一轮灰度发布做铺垫。

2 个人总结

互联网产品在于不停地升级、升级,再升级,但是升级伴随着风险,新旧版本兼容的风险,用户使用习惯突然改变而造成用户流失的风险,系统宕机的风险等。为了避免这些风险,很多产品都采用了灰度发布的策略,其主要思想就是把影响集中到一个点,然后再发散到一个面,出现意外情况后就容易回退。
分布式服务框架支持服务的灰度发布,可以实现业务的快速试错和敏捷交付。