前一篇文章中,我们概括性的了解了一下灰度发布技术和 F5 针对灰度发布的解决方案。在这篇文章中,我将会通过一个实际案例来介绍一下 F5 灰度发布解决方案的具体应用场景。



01X 用户为什么要使用灰度发布

在金融科技化的时代,灰度发布可以让应用更快地进行迭代,以更高的频率发布到市场,同时还能减轻运维人员的负担,并且给用户带来更好的体验。X 用户提供的服务已经覆盖了企业和个人的方方面面,新功能的发布、第三方接口的变更、问题的修复都会需要进行应用的升级。但是对于运维部门来说,应用变更总是伴随着风险和压力。X 用户每次互联网应用更新均需要在 23:00 停机后才能进行,经常在凌晨才能完成上线,每次上线投产后由于时间窗口较晚、验证时间较短,有些场景需要隔日验证,无法对所有场景进行覆盖,无法保证互联网应用的稳定性。同时对于业务部门和开发部门来说,新的产品和功能是否能被大部分用户接受,也存在一定的风险。

灰度发布,就是解决以上矛盾的一个最好方法。



02X 用户灰度发布建设实践

实现灰度发布最重要的两个问题是灰度策略如何制定,以及灰度策略如何执行。

灰度策略其实就是决定什么样的请求应该路由到我们的灰度版本上来,以什么为依据。在上一篇文章中我们提过通常有以下几种策略:基于地域、基于用户信息、基于交易类型。

综合考虑后, X 用户最终采用根据用户进行灰度的策略,根据不同应用的特点设置用户白名单,基于用户白名单进行灰度发布。

灰度策略执行方面, X 用户针对互联网应用已经建设了部署平台,另外 X 用户所有的互联网应用都通过 F5 负载均衡器进行交付。基于 X 用户现状,决定采用部署平台和负载均衡配合的方式实现灰度发布。在负载均衡设备上预设好灰度标志,由部署平台通过 F5 的 API 控制负载均衡的灰度标志,当进入灰度状态时,负载均衡设会将白名单用户的交易请求分发至灰度版本应用服务器。


▶灰度标志

是由部署平台调用负载均衡设备的 API 并存入负载均衡设备的表内,根据预定义,不同的灰度标志状态代表负载均衡设备执行不同的分流策略。

灰度标志状态有 4 种状态:


  1. 无灰度状态,此时请求上来交易 F5 正常分配。

  2. 正处于稳定灰度状态,此时请求上来交易, F5 解析报文,根据 COOKIE 里面是否有灰度版标识去路由交易。

  3. 灰度临界、发往常规版状态,此时将所有请求交易分发至常规版,等待状态切换至 A 。

  4. 灰度临界、发往灰度版状态,此时将所有请求交易分发至灰度版,等待状态切换至 A 。



▶客户端 + 资源包模式(手机 APP 类应用)

总体方案如下图:

主要分为以下几个步骤:


  • 生成白名单:工作人员从应用系统后管导入白名单,白名单存入业务系统,此时白名单并未生效。

  • 部署平台执行灰度发布操作:在灰度发布之前调用 F5 接口,更新 F5 灰度标志为 C ,此时阻止新交易发送至新版本所在服务器。

  • 部署平台开始发布新版本服务,发布完成后部署平台调用 F5 接口更新 F5 灰度标志为 B ,并向业务系统发送接口,更新白名单为可用。

  • 客户端发送版本查询交易,服务方根据白名单返回对应版本信息以及灰度特征码 COOKIE 至请求方。

  • F5 根据客户端请求交易中的灰度特征码对交易进行路由。

  • 部署平台执行灰度同步操作:在灰度同步之前调用 F5 接口,更新 F5 灰度标志为 D ,此时新交易全部发送至灰度版所在服务器;部署平台开始同步新版本服务,同步完成后部署平台调用 F5 接口更新 F5 灰度标志为 A ,此时 F5 正常分配路由。

  • 撤销灰度版本:部署平台执行灰度撤销操作,在灰度撤销之前调用 F5 接口,更新 F5 灰度标志为 C ,此时新交易全部发送至常规版所在服务器;部署平台开始撤销新版本服务,撤销完成后部署平台调用 F5 接口更新 F5 灰度标志为 A ,此时F5 正常分配路由。



▶无客户端模式( Web 浏览器类应用)

总体方案如下图:

无客户端模式与客户端模式步骤基本相同,区别只是在于第四步,无客户端模式会在用户进行登录交易时进行白名单匹配。



03F5 配置

以 F5 的视角看, X 用户灰度发布的整体逻辑如下:

F5社区好文推荐:F5灰度发布解决方案-应用实例_java

灰度标示保存在 F5 的 data_group 中,部署平台通过 REST API 控制 F5 设备上的灰度标示。

F5 的分发逻辑由以下 iRule 实现:

when HTTP_REQUEST {     set status [ class match -value hd_status_string equals hd_data_group ]      if { $status equals "A" } {         pool Pool_All          log "hd status is A!!"     }     elseif { $status equals "B" } {         log "hd status is B!!"         if { [HTTP::cookie exists "whtlst-head"] } {             pool Pool_B         }          else {             pool Pool_A          }      }     elseif { $status equals "C" } {         log "hd status is C!!"         pool Pool_A      }     elseif { $status equals "D" } {         log "hd status is D!!"         pool Pool_B     }     else {         pool Pool_A         log "hd status is null!!"     } }

▼可上下滑动查看全部内容

修改 F5 灰度状态标示 data_group 的 API 示例如下:

F5社区好文推荐:F5灰度发布解决方案-应用实例_java

API 路径:

https://x.x.x.x/mgmt/tm/ltm/data-group/internal/hd_data_group

API 方法: PATCH

API Body :


 {     "records": [         {             "name": "hd_status_string",             "data": "D"         }     ] }




04结语

本文通过一个具体案例像大家介绍了 F5 灰度发布解决方案的实际应用场景,希望能对大家有所启发,如果您的企业或组织也正在或准备使用灰度发布技术,可以参考本文所提到的案例,也欢迎您联系 F5 ,进行更多的交流和探讨。