【JAVA】全链路灰度发布的实践分享

本文作者:曹磊,碧桂园服务技术经理,一个喜欢研究新技术方向的代码玩家

引言

在日常发布中,如何保证系统的高可用及稳定性,是我们始终以来的重要任务。我们深知一个可靠、高效的系统对用户体验和业务运行的关键性作用。

在软件发布与功能验证的环节,我们仍然会面临许许多多的挑战,全链路灰度发布方案专为微服务架构设计,旨在应对微服务架构下的灰度发布挑战。

前版本发布策略的现状及存在的问题

目前,大部分系统都是应用了基于k8s容器的滚动发布方案,或者在滚动发布的逻辑上,实现了优雅停机的逻辑。

1.1 现状

优雅停服1个节点,保留其他节点依然提供生产服务;

通过日志,观察一段时间,看新的节点是否运行正常。如果不正常,就回滚版本;

如果运行正常,继续1、2的步骤,一直到所有节点部署完成;

测试人员上生产做基本验证。

1.2 存在问题

不能有效的控制灰度流量,导致测试人员要全部节点部署完,才可以做生产验证;

目前的滚动发布逻辑,无法做到增量更新,一旦新版本出了问题,肯定会影响到生产的运行;

难以实现全天候平滑稳定的发版;

如果版本发布涉及不同服务之间的依赖关系,或者前后端都需要调整,当前策略无法一步到位满足全链路灰度测试场景。

业界常用的软件发布策略对比

3 什么是灰度发布?为什么需要采用灰度发布?

3.1 什么是灰度发布?

灰度发布,简单来说就是先小范围进行版本发布,充分验证功能符合预期后,再逐步扩大发布范围。如果出现负面反馈或功能异常时,则需要停止放量,回滚到原先的稳定版本。

从技术上来说,灰度发布是一种流量控制方案,对服务的请求流量按用户或者其它特性打标签,保证特定标签的流量只经过特定标签的服务路径

3.2 为什么采用灰度发布?

1、降低发布风险

在新版本发布之前,通过灰度发布把新版本先部署到一小部分用户,以便能更快地发现并解决潜在的问题。

2、提高发布质量

因为在灰度发布期间可以及时发现和解决问题,所以能够在全量发布之前不断完善代码质量,提高系统稳定性和可靠性。

3、优化用户体验

在灰度发布期间,我们可以根据用户反馈来针对性地优化产品功能和界面,确保用户使用的体验最佳。

4、降低对系统性能的影响

由于灰度发布只向部分用户发布新版本,所以能够限制新版本对整个系统的影响。

全链路灰度发布的实现思路

全链路流量路由目前有两种主流实现:

1、基于 Istio

采用 Istio 这个开源 Service Mesh 组件,通过在每个服务的容器中部署 Envoy 透明代理,拦截服务之间的网络通信并按指定规则转发,从而实现了全链路流量路由,无需对现有代码进行修改。

2、基于服务发现组件

通过支持为服务设置元数据的服务注册中心,如 Nacos,可以标记服务实例的特征,例如灰度版本。每个服务可以通过注册中心获取其他服务实例的版本信息,并通过修改代码逻辑或 Java Agent 实现流量路由

接下来,我们详细来讲基于服务发现组件来实现灰度发布逻辑的方案。

灰度发布逻辑工程实践

5.1 灰度链路流程图

5.2 后端代码改造

代码改造原理是通过Spring Cloud的默认负载均衡器LoadBalancer,结合nacos提供的注册中心和配置中心,实现基于微服务网关调用和服务间OpenFeign调用的生产和灰度隔离

以下代码是以Loadbalancer为例,扩展的灰度逻辑,如果目前系统基于Ribbon,可以考虑使用Loadbalancer替换掉Ribbon,也可以直接基于Ribbon定义自己的灰度负载均衡逻辑,实现方法在本文中不做详细描述。

步骤1:指定灰度启动节点

指定灰度节点与生产节点,用于负载均衡器按规则选择不同的链路,用于区别流量,建设jenkins部署脚本时,设置在启动项里面。

步骤2:灰度负载均衡逻辑的实现

Spring Cloud的负载均衡逻辑,无论负载均衡器是LoadBalancer或者是Ribbon,默认逻辑都是轮循逻辑,可以保证每一个上线节点浏量的平均分配,但是无法保证灰度策略的实现,因此,必须得重新定义新的负载均衡逻辑。 

步骤3:开启灰度负载均衡策略

步骤4:Feign服务调用

注意,feign调用需要定义一个默认拦截器,将请求中的灰度标识继续往下传,另外,除此之外,调用的服务模块启动的时候,仍然需要在启动项上,添加开启灰度负载均衡代码,如上图。

5.3 前台灰度发布逻辑改造

前台灰度发布无需涉及到前台代码的改造,基于ingress/nginx,通过对于Cookies的指定参数进行判断,判断是否访问灰度节点或者生产节点,所以,仍然只需要在登录的时候,判断一下当前登录用户的稳定标识,进行是否需要进行灰度验证。

5.4 网关节点如何灰度发布?

以上后端服务各个节点的灰度方案,基本上都是基于负载均衡规则改写得以实现,对于网关节点的负载改造,其实也是类似于前台灰度发布逻辑,通过ingress/nginx得以实现,我们只需要在请求头中带上灰度节点标识,就可以请求到灰度网关节点,完成功能性验证。

6 成果展示

全链路灰度发布方案自创新部门应用并实施以来,首批试点项目(API能力共享平台,数据交换总线)已经完成改造,对业务产生了积极的促进作用,为A/B测试打下坚实的技术底座:

①可全天候实现系统用户零感知平滑升级。

②可以实现前后端一起发布验证,可以动态扩大灰度范围。

③可以极大的减少线上事故率,保证系统的稳定性与高可用,提升用户体验。

7 总结

灰度发布是一种有效的软件发布策略,能够在保证系统稳定性的同时,提高软件的质量和可靠性。通过逐步扩大新版本服务的流量实现滑升级和容错处理,微服务灰度发布设计为现代软件开发带来了诸多优势。然而,也需要注意其可能带来的性能下降、复杂性和开发成本增加等挑战。

在进行微服务灰度发布设计时,需要充分考虑实际业务需求和应用场景,制定合适的发布策略,并对潜在的风险进行有效控制

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容