在我们项目进行版本升级的时候,肯定要求系统不间断的提供服务,如果直接将某版本上线发布给全部用户,一旦遇到线上事故(或BUG),对用户的影响极大,解决问题周期较长,甚至有时不得不回滚到前一版本,严重影响了用户体验。
基于此,可以采用灰度发布的方式来解决。

单体架构下的服务发布

⾸先,我们先看⼀下在单体架构中,如何对应⽤中某个服务模块进⾏新版本发布。如下图,应用中的Cart服务模块有新版本迭代:


由于 Cat 服务是应用的一部分,所以新版本上线时需要对整个应用进行编译、打包以及部署服务级别发布问题变成了应用级别的发布问题,我们需要对应用的新版本而不是服务来实施有效的发布策略。

目前业界已经有非常成熟的服务发布方案,例如蓝绿发布和灰度发布。

蓝绿发布

蓝绿发布需要对服务的新版本进⾏冗余部署,⼀般新版本的机器规格和数量与旧版本保持⼀致,相当于该服务有两 套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进 ⾏版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。我们的例⼦使⽤蓝 绿发布的示意图如下,流量切换基于四层代理的流量⽹关即可完成。


在蓝绿发布中,由于存在流量整体切换,所以需要按照原服务占用的机器规模为新版本克隆一套环境,相当于要求原来一倍的机器资源。

灰度发布

根据请求内容或者请求流量的比例将线上流量的一小部分转发至新版本,待灰度验证通过后,逐步调大新版本的请求流量,是一种循序渐进的发布方式。 我们的例⼦使⽤灰度发布的示意图如下,基于内容或⽐例的流量控制需要借助于⼀个七层代理的微服务⽹关来完成。

  • Traffic Routing,基于内容的灰度方式,比如在请求头上携带tag=gray的流量路由到v2版本;
  • Traffic Shifting,基于比例的灰度方式,以无差别的方式对线上流量按照比重的方式进行分流

注意:灰度发布在机器资源成本以及流量控制能力更胜一筹,缺点就是发布周期过长,对运维基础设施要求过高。

微服务架构下的服务发布

在分布式微服务架构中,应⽤中被拆分出来的⼦服务都是独⽴部署、运⾏和迭代的。单个服务 新版本上线时,我们再也不需要对应⽤整体进⾏发版,只需关注每个微服务⾃身的发布流程即可,如下:


为了验证服务Cart的新版本,流量在整个调用链路上能够通过某种方式有选择的路由到Cart的灰度版本。这属于微服务治理领域中流量治理问题。

常见的治理策略包括基于Provide和基于Consumer的方式。

  • 1、基于Provider的治理策略:配置Cart的流量流入规则,User路由到Cart时使用Cart的流量流入规则。
  • 2、基于Consumer的治理策略:配置User的流量流出规则,User路由到Cart时使用User的流量流出规则。

全链路灰度发布

继续考虑上面微服务体系中对服务Cart进行发布的场景,如果此时服务Order也需要发布新版本,由于本次新功能涉及到服务Cart和Order的共同变动,所以要求灰度验证时能够使得灰度流量同时经过服务Cart和Order的灰度版本。如下图:


按照上一小节提出的两种治理策略,我们需要额外配置服务 Order 的治理规则,确保来自灰度环境的服务 Cat 的流量转发至服务 Order 的灰度版本。这样的做法看似符合正常的操作逻辑但在真实业务场景中,业务的微服务规模和数量远超我们的例子,其中一条请求链路可能经过数十个微服务,新功能发布时也可能会涉及到多个微服务同时变更,并且业务的服务之间依赖错综复杂,频繁的服务发布、以及服务多版本并行开发导致流量治理规则日益膨胀,给整个系统的维护性和稳定性带来了不利因素

开发者结合实际业务场景和⽣产实践经验,提出了⼀种端到端的灰度发布⽅案,即全链路灰度。全链路灰度治理策略主要专注于整个调用链,它不关⼼链路上经过具体哪些微服务,流量控制视角从服务转移至请求链路上,仅需要少量的治理规则即可构建出从网关到整个后端服务的多个流量隔离环境,有效保证了多个亲密关系的服务顺利安全发布以及服务多版本并行开发,进⼀步促进业务的快速发展。

如何在实际业务场景中去快速落地全链路灰度呢?
目前主要有两种解决思路,基于物理环境隔离和基于逻辑环境隔离

物理环境隔离

物理环境隔离,顾名思义,通过增加机器的方式来搭建真正意义上的流量隔离。

这种方案需要为要灰度的服务搭建一套网络隔离、资源独立的环境,在其中部署服务的灰度版本。由于与正式环境隔离,正式环境中的其他服务无法访问到需要灰度的服务,所以需要在灰度环境中几余部署这些线上服务,以便整个调用链路正常进行流量转发。此外,注册中心等-些其他依赖的中间件组件也 需要几余部署在灰度环境中,保证微服务之间的可见性问题,确保获取的节点 IP 地址只属于当前的网络环境。

逻辑环境隔离

我们只需部署服务的灰度版本,流量在调⽤链路上流转时,由流经的⽹关、各个中间件以及各个微服务来识别灰度流量,并动态转发⾄对应服务的灰度版本。如下图:


上图可以很好展示这种方案的效果,我们用不同的颜色来表示不同版本的灰度流量,可以看出无论是微服务网关还是微服务本身都需要识别流量,根据治理规则做出动态决策。

当服务版本发生变化时,这个调用链路的转发也会实时改变。相比于利用机器搭建的灰度环境,这种方案 不仅可以节省大量的机器成本和运维人力,而且可以帮助开发者实时快速的对线上流量进行精细化的全链路控制。

那么全链路灰度具体是如何实现呢?通过上⾯的讨论,我们需要解决以下问题:

  • 1.链路上各个组件和服务能够根据请求流量特征进⾏动态路由。
  • 2.需要对服务下的所有节点进⾏分组,能够区分版本。
  • 3.需要对流量进⾏灰度标识、版本标识。
  • 4.需要识别出不同版本的灰度流量

需要的技术:

标签路由:标签路由通过对服务下所有节点按照标签名和标签值不同进行分组,使得订阅该服务节点信息的服务消费端可以按需访问该服务的某个分组,即所有节点的一个子集。服务消费端可以使用服务提供者节点上的任何标签信息,根据所选标签的实际含义,消费端可以将标签路由应用到更多的业务场景中。

流量染色:请求链路上各个组件如何识别出不同的灰度流量?流量染色,为请求流量添加不同灰度标识来方便区分。我们可以在请求的源头上对流量进行染色,前端在发起请求时根据用户信息或者平台信息的不同对流量进行打标。如果前端无法做到,我们也可以在微服务网关上对匹配特定路由规则的请求动态添加流量标识。此外,流量在链路中流经灰度节点时,如果请求信息中不含有灰度标识,需要自动为其染色,接下来流量就可以在后续的流转过程中优先访问服务的灰度版本。

分布式链路追踪:保证灰度标识能够在链路中一直传递下去,分布式链路追踪技术对大型分布式系统中请求调用链路进行详细记录,核心思想就是通过一个全局唯一的 traceid 和每一条的 spanid 来记录请求链路所经过的节点以及请求耗时,其中traceid 是需要整个链路传递的。借助于分布式链路追踪思想,我们也可以传递一些自定义信息,如灰度标识。业界常用的分布式链路追踪产品都支持链路传递用户自定义的数据。

首先,需要支持动态路由功能,对于 Spring Cloud、Dubbo 开发框架,可以对出口流量实现自定义 Filter,在该 Filter 中完成流量识别以及标签路由。同时需要借助分布式链路追踪技术完成流量标识链路传递以及流量自动染色。此外,需要引入一个中心化的流量治理平台,方便各个业务线的开发者定义自己的全链路灰度规则。如下图所示:

灰度发布整体解决方案相关推荐

  1. 云视频自动化部署与灰度发布实践

    概要:Kubernetes改造与自动化灰度发布是一个长期的过程,需要克服很多困难.但改造也能实实在在带来研发效能的提升,支持灰度发布以后,测试的主要时间可以从晚上转到白天,减轻研发和测试和运维人员的负 ...

  2. 秒云与趋动科技联合发布容器云平台与GPU资源池化整体解决方案

    近日,秒云联合趋动科技,共同发布基于容器云平台与GPU资源池化整体解决方案,并完成秒云容器云平台与趋动科技OrionX AI算力资源池化解决方案的兼容认证测试,测试结果表明双方产品完全兼容,各项功能运 ...

  3. 驭势科技携手奇辉机器人,联合发布面向多行业的智慧物流整体解决方案

    6月29日,驭势科技与沈阳奇辉机器人应用技术有限公司(下称"奇辉机器人")正式签订深度战略合作协议,并发布基于各自优势技术共同打造的多行业智慧物流整体解决方案,可为客户提供灵活稳定 ...

  4. kafka灰度发布解决方案

    Kafka灰度发布解决方案 场景 设计方案 场景 由于我们生产环境和灰度环境共用一套kafka,灰度环境主要用于线上验证和紧急问题修复,但是有时灰度发布后,会消费生产环境的kafka数据,影响生产环境 ...

  5. 发布职位:毫末智行HAOMO.AI#a轮数亿,美团首钢高瓴资本解决方案:自驾系统+自驾计算平台+末端物流整体解决方案 渐进式自动驾驶研发技术路线(量产L2->L5)base;北上保定前

    发布职位:毫末智行HAOMO.AI# a轮数亿,美团首钢高瓴资本 解决方案:自驾系统+自驾计算平台+末端物流整体解决方案 渐进式自动驾驶研发技术路线(量产L2->L5) base:北上保定 前端 ...

  6. Spring Cloud 灰度发布解决方案

    文章已收录 架构技术专栏 收藏不迷路,点击获取更多视频资料福利 因为目前公司架构全部切换到spring cloud 模式,对于服务灰度方面没有dubbo zk的方便了,所以细细研究总结下留作备份.目前 ...

  7. 灰度发布、蓝绿部署、金丝雀都是啥?

    目录 滚动部署 蓝绿发布 为什么还需要蓝绿 金丝雀发布(canary) 金丝雀和蓝绿的对比 灰度发布 A/B Test 实现 kubernetes istio spring cloud 网关 参考 滚 ...

  8. 微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别...

    更多内容关注微信公众号:fullstack888 在有关微服务.DevOps.Cloud-native的迭代过程中,不可避免的需要"上线",上线就需要部署,需要部署就意味着有修改, ...

  9. Android开发规范:APP版本发布(全量发布、灰度发布)

    我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 全量发布 灰度发布 欢迎加入Android开发交流QQ群: app ...

最新文章

  1. Jira接入钉钉机器人
  2. 【FPGA】ODDR使用研究记录
  3. getDimension等区别
  4. “约见”面试官系列之常见面试题第三十四篇之事件冒泡、事件捕获、事件代理(建议收藏)
  5. 离散对数(例题+详解+代码模板)
  6. 生态功能区划方法之三:聚类分析法和生态融合法
  7. 什么是Github?
  8. eclipse maven打包_自动化管理项目,Maven仓库配置、安装和使用
  9. activiti processEngineLifecycleListener使用
  10. 拓端tecdat|R语言基于线性回归的资本资产定价模型(CAPM)
  11. 经典日内策略分析(收藏版)Dual Thrust、ATR、R-Breaker、菲阿里四价
  12. 程序员老外通过编程赚钱的10个途径
  13. 云解析 dns 服务器,你知道为什么云解析DNS又快又安全吗?
  14. 汇编语言使用GPIO模拟IIC通信
  15. 什么软件能把蓝底换白底
  16. Python3初步实践教程概要
  17. 【人脸识别】face_recognition 库的使用
  18. 【代码阅读】WarpGAN: Automatic Caricature Generation
  19. #.数学函数3D图的绘制
  20. 有限责任公司的概念与特征

热门文章

  1. unity 不再渲染局部_在Unity3D中的渲染优化-减少需要处理的顶点数目
  2. 无尘车间净化装修方案
  3. 购房合同补充协议有法律效力吗
  4. MySQL导入selectclass文件_MySQL执行Select语句将结果导出到文件的方法 – 疯狂的蚂蚁...
  5. 课程设计————学生信息管理系统(包含历代思路和代码)
  6. C# 控件之 TreeView
  7. APE,FLAC文件转WAV文件
  8. 操作系统课程知识点整理
  9. 媒界:TikTok for Business举办出海营销启航会,助力品牌抢占细分赛道
  10. java中parseint函数_java中parseint函数