首页 > 其他分享 >分布式中灰度方案实践

分布式中灰度方案实践

时间:2022-09-07 11:25:23浏览次数:91  
标签:服务 请求 实践 灰度 规则 分支 路由 分布式

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

一、背景介绍

在分布式系统中会有这样的开发场景。不同的需求可能会涉及到同一个服务的开发,所以在开发期间会有多个版本的服务并行。为了保持不同版本之间的隔离,接受请求需要路由到指定版本号的服务进行处理;

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

二、加载策略

在微服务系统架构中,请求在服务之间转发时会执行负载策略,特别是当服务有多个版本号的集群模式时,显然常规的轮询、权重、随机等策略无法满足要求;制定路由规则 定制设计和开发是一种常用的方式;

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

默认主分支路由

一般来说,请求会在trunk分支上执行,或者如果其他分支的路由规则不匹配,也可以通过识别配置来判断是否被master分支覆盖,甚至是任何幸存的服务;

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

版本号统一路由

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

服务自定义路由

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

路由规则可以看作是对可用服务的匹配和过滤。如果过滤后的服务部署在集群中,则必须执行相应的负载均衡策略。例如,当上图中的服务 C 3.0.0 当分支为集群时,路由匹配版本后,通过负载均衡策略选择其中一个服务处理请求;

3.灰度部署

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

分布式系统中有很多子服务。版本开发通常只涉及其中一些子服务。相关业务通过灰度方式在线部署,不会影响骨干业务。将请求卸载到灰度服务;

工艺细节

  • 1、做好路由配置和管理,请求默认在骨干服务中执行;
  • 2、对于部署版本涉及的相关服务,灰度默认不处理请求;
  • 3.接受阶段,根据配置,将指定规则的请求路由到灰色层;
  • 4、常用规则:携带分支数、灰度用户组、比例分布、IP等;
  • 5、灰度服务完成验收后,将相关服务标记为主要服务;
  • 6、老骨干服务下线后,上线流程完成;
  • 7、如果发现灰度服务接受失败,可以去掉灰度层或者修改;

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

在这种模式下,灰度服务的上线或下线几乎不明显。如果是比较简单的流程,测试者可以接受灰度服务。如果是复杂的流程,释放一定比例的服务。用户流量,过程观察无问题后升级完成;

四、练习计划

1. 工艺设计

在实现灰度方案的过程中,客户端通常会携带路由规则的标识,从而将请求发送给指定的服务。当规则无法正常匹配时,由骨干服务处理。对于一些核心交换机,标识在配置中心。统一维护;

2.路由ID

身份获取

通常在请求头中携带路由的标识,更便于统一管理。常用的交付格式如下:

  • 版本号统一路由:routeId:2.0.0,即所有请求优先 2.0.0 分支执行;
  • 服务自定义路由:serverC:3.0.0,请求服务C时,优先级为 3.0.0 分支执行;

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

身份管理

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

  • 写入阶段:在过滤或拦截中获取路由标识,写入上下文容器;
  • 读取阶段:路由时从容器中读取标识符,根据配置信息执行规则;

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

3.服务选择

微服务之间通信时,选择服务执行请求的逻辑比较复杂,尤其是灰度模式,涉及到路由规则的修改,即先选择策略指定的服务;

  • 1、从注册中心查询对应服务的可用列表;
  • 2、根据路由规则,匹配与请求标识符匹配的服务;
  • 3、对过滤后的结果列表进行负载均衡,选择服务;

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

5.参考源码

 应用仓库:  
 https://gitee.com/cicadasmile /butte-flyer-parent 组件包装器:https://gitee.com/cicadasmile /butte-frame-parent 复制代码

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议。转载请附上原文出处链接和本声明。

这篇文章的链接: https://homecpp.art/0507/7173/0840

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/22618/16420711

标签:服务,请求,实践,灰度,规则,分支,路由,分布式
From: https://www.cnblogs.com/amboke/p/16664709.html

相关文章

  • 分布式中灰度方案实践
    让请求在导航的服务节上点执行;一、背景简介分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,......
  • WebGL压缩纹理实践
    0x01本文将讲述压缩纹理在实际项目中的使用的案例。最近的一个项目是这样的:项目由于涉及到的建筑物特别多,大概有近40栋的建筑,而每一栋建筑物,又有10层楼,每层楼里面又有很多......
  • DB\redis\zookeeper分布式锁设计
    多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。常见的分布式锁实现一般是基于DB、Redis、zookeeper......
  • python fastapi + uvicorn 记录日志的最佳实践,结合nb_log
      pythonfastapi+uvicorn记录日志的最佳实践,要记录对fastapi什么时候请求了什么url和入参,只需要记录uvicorn命名空间的日志就可以了。文章使用nb_log五彩日志来......
  • 分布式事务原理及解决方案案例
    事务的具体定义事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有4个属性:原子性......
  • HDFS 伪分布式环境搭建
    HDFS伪分布式环境搭建作者:Grey原文地址:博客园:HDFS伪分布式环境搭建CSDN:HDFS伪分布式环境搭建相关软件版本Hadoop2.6.5CentOS7OracleJDK1.8安装步......
  • 数据库治理的探索与实践
    简介: 本文是MSE即将推出的一个数据库治理能力的预告,我们从应用的视角出发整理抽象了我们在访问、使用数据库时场景的一些稳定性治理、性能优化、提效等方面的实战经验,对......
  • 如何高效解决 C++内存问题,Apache Doris 实践之路|技术解析
    导读:ApacheDoris使用C++语言实现了执行引擎,C++开发过程中,影响开发效率的一个重要因素是指针的使用,包括非法访问、泄露、强制类型转换等。本文将会通过对Sanitizer......
  • 基于 eBPF 的 Kubernetes 可观测实践
    简介: 阿里云可观测团队构建了kubernetes统一监控,无侵入式地提供多语言、应用性能黄金指标,支持多种协议,结合Kubernetes管控层与网络系统层监控,提供全栈一体式的可观测......
  • MSE 支持 Apache Shenyu 网关实现全链路灰度
    作者:卜比什么是全链路灰度微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度......