分布式中灰度方案就该这样设计!

如何设计可靠的灰度方案 简介:一个较大的业务或系统改动,往往会影响整个产品的用户体验或操作流程。为了控制影响面,可以选取一批特定用户、流程、单据等,只允许这一部分用户或数据按照变更后的新逻辑在系统中流转,而另一部分用户仍然执行变更前的老逻辑。这一步是线上系统灰度方案的起点。 作者 | 既同 来源 | 阿里技术公众号 一 灰度的基本概念 1 一个典型的灰度方案 一个较大的业务或系统改动,往往会影响整个产品的用户体验或操作流程。为了控制影响面,可以选取一批特定用户、流程、单据等,只允许这一部分用户或数据按照变更后的新逻辑. 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:知了一笑


让请求在导航的服务节上点执行;

一、背景简介

分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版本之间的隔离性,验收需要将请求路由到指定版本号的服务上处理;

7752a68bddaafa259346c741a07973ce.png

假设存在三个服务:A、B、C,且服务B和C都存在多个版本,那么让请求按照即定的路由规则执行,即可保证研发期间的验收是版本间隔离的,并且可以实现灰度部署的策略;

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、负载策略

在微服务系统架构中,请求在服务间转发时会执行负载的策略,尤其当服务存在多版本号的集群模式时,很显然常规的轮询、权重、随机等策略无法满足需求;进行路由规则的自定义设计和开发是常见方式;

经典应用场景:在请求发起时,可以通过Header、Cookie、Parameter等不同的方式,携带路由规则的方式与参数执行匹配逻辑,从而将请求路由到指定版本的服务;

默认主分支路由

4b6ec9fc38fd06b131d3ba9401f4f94b.png

通常来说请求会在主干分支上执行,或者其他分支路由规则不匹配,也可以通过标识配置,判断是否由主分支兜底,甚至是存活的任意服务兜底;

存活的服务中可能存在多个版本,但是主分支Master是否存活是服务健康与否的基本标志,常规应用中路由规则如果不匹配,会由Master服务进行兜底;

版本号统一路由

2d0aebe6a26514efe225fa3e3a6a6341.png

请求通过携带分支号进行统一版本路由是常用的轻量级方案,即如果请求携带的是2.0.0的分支,则在路由时优先匹配相关版本的服务,不匹配时由Master服务处理即可;

服务定制化路由

05b2de96adbcdf4aa8046373eb3d4086.png

在请求或配置中指定各个服务的路由分支号,也是常见的匹配方案,如上图在请求时指定服务B由1.0.0分支执行,服务C由3.0.0分支执行,其余服务在主干分支执行;

路由规则可以看做是对可用服务的匹配筛选,如果筛选出来的服务存在集群部署时,还要去执行相应的负载均衡策略,例如上图中当服务C的3.0.0分支是集群时,路由匹配到该版本后,再通过负载均衡的策略选中其中一个服务处理请求;

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、灰度部署

当负载均衡的策略可以按照定制化开发的规则执行时,那服务的灰度发布就会容易很多,在不影响现有服务的情况下发布新版本,同时将请求按照规则分流,完成对新服务的验收后,替换掉旧版本即可;

47ff6e7e6bd22fce2936ae36e29d814b.png

分布式系统中子服务的拆分非常多,版本开发通常只会涉及其中部分子服务,通过灰度模式将相关服务部署到线上,并且不会影响主干的服务,只有开启特定的配置才会将请求分流到灰度服务;

流程细节

  • 1、做好路由配置和管理,请求默认在主干服务执行;

  • 2、部署版本涉及的相关服务,灰度层面默认不会处理请求;

  • 3、验收阶段基于配置,将指定规则的请求路由到灰度层;

  • 4、常用规则:携带分支号、灰度用户群、比例分流、IP等;

  • 5、完成灰度服务验收后,将相关服务标记为主干服务;

  • 6、将旧的主干服务下线后,即本次上线流程完整结束;

  • 7、若发现灰度服务验收失败,撤掉灰度层或修改都可以;

灰度发布的模式即依赖于自定义的路由规则,以及服务在负载均衡时权重比例倾斜,这些都可以在配置中心管理,在测试时动态修改即可;

在这种模式下,灰度服务的上线或者下线几乎是没有明显感知的,如果是相对简单的流程,由测试人员验收灰度层服务即可,如果是复杂的流程,放开一定比例的用户流量,流程观察没有问题后完成升级;

四、实践方案

1、流程设计

3a6958373f0211d33e92bb94eeb41a59.png

在灰度方案落地实践的过程中,通常客户端会携带路由规则的标识,从而将请求发送到指定服务,在规则无法正常匹配的时候,由主干服务处理,对于一些核心的开关标识在配置中心统一维护;

2、路由标识

标识获取

通常情况下,路由的标识是在请求头中携带的,这样比较方便统一管理,常用的传递格式如下:

  • 版本号统一路由:routeId:2.0.0,即所有请求优先在2.0.0分支执行;

  • 服务定制化路由:serverC:3.0.0,请求服务C时优先在3.0.0分支执行;

在微服务的组件中获取请求头的方式很多,比如Gateway网关中的路由过滤器,或者服务中的拦截器,都可以获取请求的相关参数信息,从而执行路由规则;

标识管理

自定义路由规则需要客户端标识,虽然获取请求中的标识并不复杂,但是将标识传递到路由规则中就涉及到上下文参数管理:

4ae4c00664f7628b188e5e40d70c6946.png
  • 写阶段:在过滤或拦截中获取路由标识,写入上下文容器;

  • 读阶段:路由时从容器中读取标识,基于配置信息执行规则;

请求从进入网关开始,在服务间通信时会涉及负载均衡的策略,在过滤或拦截器中将标识写到上下文容器,执行路由规则需要读取上下文容器,如果标识不存在则默认选择主干服务执行请求;

3、服务选中

微服务之间通信时,选中一个服务执行请求的逻辑比较复杂,尤其在灰度模式下涉及到对路由规则的改造,即策略指定的服务优先被选中;

4402e4c1a4eb8ebff60fd362f2708f1d.png
  • 1、从注册中心查询相应服务的可用列表;

  • 2、基于路由规则,匹配符合请求标识的服务;

  • 3、对筛选的结果列表执行负载均衡,选中服务;

在整个路由机制中,会涉及到匹配规则自定义改造,从常规的手段来看,将版本的分支号加载到服务的元数据信息中,再结合服务名称或者IP地址,来实现对服务列表的多维度过滤,可以支撑大部分轻量级灰度策略的实现。

五、参考源码

应用仓库:
https://gitee.com/cicadasmile/butte-flyer-parent

组件封装:
https://gitee.com/cicadasmile/butte-frame-parent


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

572abf539c84361b911f6576c4708fe6.png

已在知识星球更新源码解析如下:

9ce9b3a9ef0c76efafcc697340e24cab.jpeg

5c26d9d9d1665f0198122d53d7a355a4.jpeg

60f33db8387f638c04671c19ed19f878.jpeg

200844cbc8304ec8b583e04ef568250e.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
几种灰度发布方案 灰度方案 阅读详情

相关推荐

不容错过的灰度发布系统架构设计

JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84008965的博客 1195

灰度概念说明

灰度发布(又名金丝雀发布),是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。 灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。

qq_32590535的博客 2846

提示工程灰度发布架构设计:从单体到分布式,架构师的演进之路

提示工程作为AI系统的“输入层大脑”,其版本迭代的风险与效率直接决定了AI产品的用户体验。本文从架构师视角出发,系统梳理提示工程从单体架构到分布式灰度发布架构用第一性原理拆解“提示工程+灰度发布”的核心矛盾(风险可控vs迭代效率);逐层推导分布式架构的组件设计(流量调度、提示管理、监控反馈);结合生产级代码实现与案例,说明如何解决“版本冲突、流量倾斜、效果评估”等关键问题;延伸讨论AI时代架构师的能力边界(伦理考量、智能调度、跨团队协作)。本文既是提示工程灰度发布的设计手册。

AI天才研究院 840

灰度生产部署方案记录

灰度环境 什么是灰度环境?我们先看看百度上对于灰度发布的定义,如下: 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。 灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。 ...

凉茶冰 9734

我的老款Intel MacBook Pro,如何用OpenVINO把本地大模型推理速度提升10倍?

本文详细介绍了如何在老款Intel MacBook Pro上使用OpenVINO工具包将本地大模型推理速度提升10倍。通过对比Ollama CPU原生、Transformers原生和OpenVINO优化三种方案,展示了OpenVINO在性能优化上的显著优势,并提供了从环境配置到模型转换、性能调优的完整实战指南。

weixin_28694295的博客 303

机器学习(ML)在材料领域应用

机器学习作为一种兼顾开发效率以及开发成本的方法,已经逐渐应用于材料发现、结构分析、性质预测、反向设计等多个领域,并且在材料学研究中展现出惊人的潜力。传统的发现新材料的方法,如经验试错法和基于密度泛函理论(DFT)的方法,往往需要较长的研发周期,成本高、效率低,已经不能很好的适应如今需求量激增的材料学领域 ...

W5632DE的博客 3719

分布式配置与灰度发布方案

本文提出基于Nacos Config + Sentinel的分布式灰度发布方案,包含完整的架构设计和生产环境实践。核心内容包括: 灰度发布架构设计:采用微服务架构,结合API网关、配置中心和监控体系实现灰度发布闭环 多种灰度策略实现: 基于IP/标签/版本的精确路由 流量比例控制 自定义规则匹配 关键技术实现: Nacos Config统一配置管理 Sentinel动态规则下发 自动监控与回滚机制 生产环境最佳实践: 蓝绿发布与金丝雀发布 灰度流量监控方案 高可用配置策略 方案提供完整的Java实现示例,包

qq_43414012的博客 810

用于可靠的钙钛矿薄膜瞬时光致发光模拟的拟合程序

简介 对光激发后的电荷载流子动态的研究对于确定太阳能电池的几个特性至关重要,例如,体和界面重组的数量以及向电荷传输层转移过程的速度。 瞬态光致发光(trPL)是用于研究这些特性的最流行的表征方法之一。 该实验是通过在样品上照射几纳秒的激光脉冲,并记录一段时间内的发光情况来进行的。辐射性重组的光生电荷载流子将引起太阳能电池的光子发射,而非辐射性重组的电荷载流子将不会对发光作出贡献。因此,可以测量到强度随时间递减的光致发光瞬态。(见图1表示trPL的测量和它的输出)。 图1. 一...

FluximAG的博客 2363

分布式中灰度方案实践

分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版本之间的隔离性,验收需要将请求路由到指定版本号的服务上处理;假设存在三个服务:A、B、C,且服务B和C都存在多个版本,那么让请求按照即定的路由规则执行,即可保证研发期间的验收是版本间隔离的,并且可以实现灰度部署的策略;

m0_73088370的博客 328

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 957

UE5动画革命:如何用Motion Matching技术让你的游戏角色动作更流畅(附实战配置)

本文深入解析了UE5中Motion Matching技术的实战配置与应用。通过对比传统动画状态机的局限,详细阐述了如何构建动画数据库、在UE5中配置Pose Search Database及动画蓝图,并探讨了与IK融合、性能优化等进阶策略。该技术能显著提升游戏角色动作的流畅度与真实感,是下一代动画解决方案的核心。

weixin_29075633的博客 862

灰度发布与A/B测试:Flutter+鸿蒙的分布式全量发布方案

本文介绍了灰度发布与A/B测试的概念及其在Flutter与鸿蒙系统中的实现方案。灰度发布通过逐步推送新版本降低风险,A/B测试则通过数据对比优化决策。利用Flutter的跨平台特性和鸿蒙的分布式能力,可实现多设备协同的灰度策略同步。技术实现包括用户分组路由控制、鸿蒙分布式数据同步等,提供了代码示例和应用场景说明。该方案在某电商App中成功应用,使发布周期缩短40%,CTR提升12%,同时指出了分布式数据同步延迟等注意事项。

2502_94507659的博客 1610

Waymo数据集里的隐藏彩蛋:5个激光雷达数据融合实战(附Python代码)

本文深入解析Waymo数据集中5个激光雷达的数据融合技术,提供Python实战代码,帮助开发者掌握多传感器协同工作的关键方法。通过时间同步、坐标转换和运动补偿等技术,实现高精度3D场景重建,提升自动驾驶系统的环境感知能力。

weixin_30399821的博客 83

微服务全链路灰度方案介绍

技术不断在更新迭代,相对应的软件架构也在不断迭代和演进,从一开始的单体架构、集群架构到分布式架构,再到现如今的SOA架构、微服务,以及Serverless架构等,企业为了应对自身业务的快速发展,不断对架构设计进行调整和优化,在享受微服务架构带来的技术红利的同时,也面临诸多挑战。比如请求链路的复杂度提高,新功能发布时会涉及到多个微服务同时变更,并且业务的服务之间依赖错综复杂,频繁的服务发布、以及服务多版本并⾏开发导致流量治理规则⽇益膨,给整个系统的维护性和稳定性带来了不利因素。本文就来探讨下微服务场景发布方案

qq_25409421的博客 2136

【Hermes Agent】2026 Hermes Agent 最新入门级实战指南:从原理、部署、模型配置到落地 Demo

当下 Vibe Coding、AI 自动化时代,单纯对话大模型已经没有竞争力,

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 245

RAP Draft Handling 全面拆解:从独占 Draft 到协作 Draft 的架构与落地实践

独占 Draft 的启用点在行为定义头部的with draft。with draft;create;update;delete;with draft;上面这段代码来自一个完整的 Draft 启用示例,包含了 Draft 表声明、锁策略、ETag、Draft 动作等关键要素。:告诉框架草稿存哪。:告诉框架如何做并发控制与一致性保护。:把草稿生命周期动作显式暴露出来,让 UI 与事务引擎能正确驱动流程。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 958

我摊牌了!真正的灰度队列实现方案!全网你都搜不到!

背景目前,公司方面 RPC 调用如 Dubbo、Feign 已经能支持基于灰度的调用,但是 MQ 还没有支持灰度的能力,因此导致在测试和生产环境业务验证、消息隔离方面体验比较差,因此我们基于 RabbitMQ 和 Kafka 实现了消息灰度的能力。灰度场景大部分场景下 MQ 的灰度并不会像 RPC 那样那么严格,但是我们需要确认消费场景,即当灰度消费者不存在的情况下,消息是否应该由正常消费者去消费...

艾小仙的专栏 2697

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

灰度发布详解

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

cnzzs的博客 3740

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: Java 8 腰斩!Java 17 暴涨 2300%!!
下一篇: 美团太细了,HashMap可以存null,ConcurrentHashMap不可以,为什么?
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值