分布式中灰度方案实践

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

一、背景简介

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

分布式中灰度方案实践

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

二、负载策略

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

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

默认主分支路由

分布式中灰度方案实践

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

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

版本号统一路由

分布式中灰度方案实践

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

服务定制化路由

分布式中灰度方案实践

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

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

三、灰度部署

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

分布式中灰度方案实践

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

流程细节

  • 1、做好路由配置和管理,请求默认在主干服务执行;
  • 2、部署版本涉及的相关服务,灰度层面默认不会处理请求;
  • 3、验收阶段基于配置,将指定规则的请求路由到灰度层;
  • 4、常用规则:携带分支号、灰度用户群、比例分流、IP等;
  • 5、完成灰度服务验收后,将相关服务标记为主干服务;
  • 6、将旧的主干服务下线后,即本次上线流程完整结束;
  • 7、若发现灰度服务验收失败,撤掉灰度层或修改都可以;

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

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

四、实践方案

1、流程设计

分布式中灰度方案实践

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

2、路由标识

标识获取

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

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

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

标识管理

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

分布式中灰度方案实践
  • 写阶段:在过滤或拦截中获取路由标识,写入上下文容器;
  • 读阶段:路由时从容器中读取标识,基于配置信息执行规则;

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

3、服务选中

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

分布式中灰度方案实践
  • 1、从注册中心查询相应服务的可用列表;
  • 2、基于路由规则,匹配符合请求标识的服务;
  • 3、对筛选的结果列表执行负载均衡,选中服务;

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

五、参考源码

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

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

Original: https://www.cnblogs.com/cicada-smile/p/16663555.html
Author: 知了一笑
Title: 分布式中灰度方案实践

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610402/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python 练习题:请利用循环依次对list中的每个名字打印出Hello, xxx!

    方法一: python;gutter:true; -<em>- coding: utf-8 -</em>- 请利用循环依次对list中的每个名字打印出Hel…

    Linux 2023年6月8日
    0100
  • conda 和 pip 的具体区别

    pip install 安装包时不会自动安装所需的其他依赖包,只是在缺少其他依赖包时作错误提示,这时需要手动安装其他依赖包 pip 不会将python看成包,不能对环境中的pyth…

    Linux 2023年6月7日
    095
  • Windows安装Mysql.zip

    设定环境变量并新建配置文件 在系统环境变量 Path中新建刚刚下载的文件并解压的路径 E:\mysql-8.0.29-winx64\bin. 新建配置文件请参考以下文件, 将文件更…

    Linux 2023年6月7日
    0106
  • Linux tcpdump抓包命令排查

    bash;gutter:true; tcpdump命令行参数介绍:</p> <p>-A 以ASCII格式打印出所有分组,并将链路层的头最小化。 -c 在收到…

    Linux 2023年6月13日
    095
  • Laxcus集群操作系统桌面图标优化和算法

    泰山不拒细壤,故能成其高;江海不择细流,故能成其深。全抱之末生于毫末,九层之台起于累土,千里之行始于足下。 任何一个完善成熟的产品,都是从微小的改进开始! Laxcus集群操作系统…

    Linux 2023年6月6日
    099
  • pyQt的基本使用

    1. 基本窗口 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == ‘__mai…

    Linux 2023年6月7日
    0117
  • Tomcat

    Tomcat Tomcat tomcat简介 tomcat的用处 部署tomcat 测试访问 访问Host Manager界面 访问Server Status tomcat简介 T…

    Linux 2023年6月6日
    0137
  • SQLI-LABS(Less-4)

    Less-4(GET-Error based-Double Quotes-string) 打开 Less-4页面,可以看到页面中间有一句 Please input the ID a…

    Linux 2023年6月6日
    085
  • 【5】2022年7月

    7月3日 总结3号的一天就是只有一句话,”自己经历了什么只有自己最清楚,不要辜负自己经历的”。 7月3号凌晨2点,收拾好行李和整理房间,在网上购买日常用品到…

    Linux 2023年6月13日
    087
  • Java8新特性终极指南

    欢迎来到Java学习之Java8新特性终极指南 目录 系列文章目录 @ 目录 系列文章目录 Java语言新特性 Lambda表达式 函数式接口 方法引用 接口的默认方法 重复注解 …

    Linux 2023年6月13日
    0114
  • Java基础 String

    String类 字符串是一个特殊的对象。 字符串一旦初始化就不可以被改变。 String s="abc"; 特点: String构造函数 主要几个String构…

    Linux 2023年6月14日
    0137
  • bash 中 echo & printf

    首先列一下今天收获的消息 sh是: Bourne Shell(/usr/bin/sh或/bin/sh) bash是: Bourne Again Shell(/bin/bash) p…

    Linux 2023年6月6日
    0107
  • phpcms抛出的二维数组转移到js,js中for….in遍历数组,用“.”连接来读出一维数组值

    直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action=”lists”}或{pc:get sql=”…

    Linux 2023年6月13日
    0101
  • 本篇还玩“障眼法”,一文解读HTML内联框架Iframes。

    写在开篇 假设有一个需求,想要在网页内显示其它网页,怎么搞?很简单,可以用iframe来解决,那啥是iframe?本篇的主题就是它,接下来我们一一解剖它的用法。 嵌入第三方url页…

    Linux 2023年6月7日
    0131
  • 如何优雅的处理 accept 出现 EMFILE 的问题

    通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,用于和客户端之间的数据传输 在服务器的开发中,有时会遇到这种情况:当调用 accept 函数接受客户端连接,函数…

    Linux 2023年6月13日
    097
  • win11下配置vue3版本

    安装node.js PS:全局需要使用管理员权限打开CMD** 下载nodejs的地址 选择左边就好 下载安装后,选择自己需要安装的盘符,即可,不再叙述。 打开CMD查看node是…

    Linux 2023年6月14日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球