Spring cloud ribbon实现灰度发布
- 灰度发布
灰度发布是在多版本控制的基础上进一步扩展实现出来的项目 -> fm-cloud-graybunny,抽象出灰度服务、灰度服务实例、灰度策略、灰度决策等。
灰度策略可以从request ip, request patameter, request header等方面进行去创建,也可以根据bamboo的LoadBalanceRequestTrigger结合graybuanny的接口去扩展灰度策略和灰度决策。
- 场景
有两个服务,共四个服务实例,分别是ServiceA-1, ServiceA-2, ServiceB-1。其中ServiceA-2是灰度实例。
- 场景1
所有请求头usertype:old,ip:10.217..的请求或者请求头usertype:test, url 参数action:create的请求,都会被转发到的灰度服务ServiceA-2 。 - 场景2
ServiceA-2通过一段时间的观察,判定运行稳定,开始ServiceA-2删除灰度标记,开始和ServiceA-1一样会加入正常的负载均衡规则当中。 - 场景3
服务ServiceB发布新版本,ServiceB-2需要灰度注册,注册成功后所有的请求不能转发到ServiceB-2, 在为ServiceB-2设置灰度策略后,符合策略的请求才会被转发到ServiceB-2上。- 思路
从上面的场景分析,可以归纳出两个对象:服务实例和调用请求;服务实例的灰度管理是基础,调用请求时如何决策路由,都是根据服务实例的灰度策略去判断的。既然有灰度管理这个概念,那么从功能上分,就会有client-server之分,所以又可以从graybunny-client和graybunny-server去分析。接下来将一步一步去分析这四个方面。
- 灰度实例
- 实例注册
服务实例添加到灰度管理中。 - 实例下线
服务实例下线,从灰度管理中删除。 - 灰度开关
调整服务实例的灰度状态,有启用、禁用两个状态,禁用的实例不纳入灰度列表中。 - 灰度策略
请求是否可以被转发到该服务实例的条件,只有通过,请求才有可能会被转发到该实例上。- 调用请求
- 灰度决策
根据请求的信息去匹配灰度服务实例的灰度策略,如果匹配上,会将服务实例加入到通过列表中。如果都没有匹配上,就按bamboo的路由规则去筛选非灰度的服务实例进行转发。- 灰度客户端
调用请求的服务消费者,和提供服务的服务提供者都可以是灰度客户端,因为微服务中,大多服务实例既是服务提供者,同时也是服务消费者。
- 灰度服务注册
服务实例在启动时,就会向灰度服务端发起请求,将实例自身的灰度开关打开。 - 灰度服务下线
在服务实例下线前,会触发钩子,向灰度服务端发起请求将实例自身从灰度列表中删除。 - 接收灰度实例调整消息
接收由灰度服务端推送过来的灰度列表更新消息比如新增灰度实例,删除灰度实例等,维护缓存在实例上的灰度列表。 - 定时拉取灰度列表
定时从灰度服务端拉取最新的灰度列表,维护实例自身缓存的灰度列表。- 灰度服务端
灰度服务端负表维护灰度列表,可以新增、删除、编辑灰度信息。
- 编辑灰度实例
新增灰度实例,删除灰度实例,修改实例灰度状态。 - 编辑灰度策略
新增实例灰度策略,删除实例灰度策略,修改灰度策略状态。 - 推送灰度服务调整消息
向灰度客户端推送灰度列表变动消息,比如新增灰度实例,删除灰度实例,修改实例灰度状态等。 - 定时检查服务实例是否下线
定时检查灰度服务实例是否下线,下线的的实例将从灰度列表中删除。
- 代码设计
根据上面的思路,设计以下对象和接口。共6个接口,4个模型对象。
对象:
对象 |
描述 |
GrayService |
灰度服务 属性包括:灰度服务ID、灰度实例集合 |
GrayInstance |
灰度实例,有状态属性 属性包括:灰度服务ID、灰度实例ID、策略组集合、灰度开关。 |
GrayPolicyGroup |
灰度策略组,有状态属性 属性包括:灰度策略组ID、灰度策略集合、灰度策略是否可用。 |
GrayPolicy |
灰度策略 属性包括:策略ID、策略类型、map集合 策略类型包括:REQUEST_IP,REQUEST_HEADER, REQUEST_PARAMETER, CONTEXT_PARAMS(合并匹配,既在map集合中使用多种策略类型) |
接口:
接口名称 |
描述 |
GrayManager |
灰度客户端管理器,维护灰度列表,维护自身灰度状态,创建灰度决策对象。抽象实现类AbstractGrayManager实现了基础的获取灰度列表, 创建灰度决策对象的能力。BaseGrayManger在期基础上进行了扩展,将灰度列表缓存起来,定时从灰度服务端更新灰度列表。 |
InformationClient |
该接口主要是负责和灰度服务端进行通信,获取灰度列表,编辑灰度实例等能力。其实现类HttpInformationClient默认使用http方式访问灰度服务端。 |
GrayDecision |
该接口是灰度决策,用来判断请求是否匹配灰度策略。实现了ip匹配、request parameter匹配、request header匹配、BambooRequestContext中的参数匹配器以及合并匹配等多个匹配能力。 |
GrayDecisionFactory |
灰度决策的工厂类,其默认实现类支持上述几种灰度决策的创建。 |
GrayServiceManager |
灰度服务管理类,属于服务端的类。主要是编辑服务实例,编辑灰度策略,以及维护最新的灰度列表。 |
GrayBunnyServerEvictor |
接口类 |
EurekaGrayBunnyServerEvictor |
该类是GrayBunnyServerEvictor的具体实现类,如果灰度服务实例下线后, 由于意外情况,没有向灰度服务端发送删除请求,服务端会每隔一段时间调用该接口的方法,检查灰度列表中的实例是否下线,如果实例已下线,就将其从灰度列表中删除。EurekaGrayBunnyServerEvictor是依赖EurekaClient来检查服务实例是否下线。 |
- 灰度负载规则和灰度决策
类名称 |
描述 |
GrayLoadBalanceRule |
该类继承多版本控制中的BambooZoneAvoidanceRule类, 灰度路由 : 灰度路由是客户端必须要实现的能力,graybunny是在bamboo的基础上扩展的,所以graybunny的路由规则对象GrayLoadBalanceRule继承了BambooZoneAvoidanceRule,choose()逻辑是这样的: 1、 判断目标服务是否有灰度实例。 1、 如果没有, 执行父类逻辑。结束。 2、 有灰度实例,先将灰度实例和非灰度实例筛选出来。 2、 挑选灰度实例, 筛选调用请求匹配上灰度实例的策略。 1、 如果没有匹配的灰度实例, 将非灰度实例列表传递过去执行父类的筛选逻辑。结束。 2、 如果有匹配的灰度实例, 从其中按轮询的方式挑选出一个实例。结束。 |
Spring cloud ribbon实现灰度发布相关推荐
- Spring Cloud 优雅下线+灰度发布
前言 在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题.如果在我们升级服务的时候,会造成一段时间内的服务不可用,这就是不够优雅的.那什么是优雅的呢?主要就是指在服务升 ...
- 【305期】Spring Cloud 优雅下线+灰度发布
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 文章目录 ...
- Spring Cloud全链路灰度发布
一.前言 实际生产中如有需求变更,并不会直接更新线上服务,最通常的做法便是:切出线上的小部分流量进行体验测试,经过测试后无问题则全面的上线.这样做的好处也是非常明显,一旦出现了BUG,能够保证大部分的 ...
- 3 Spring Cloud Ribbon
Spring Cloud Ribbon Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具. Netflix Ribbon 是 Net ...
- Spring Cloud Ribbon的使用详解
目录 一.概述 1.Ribbon是什么 2.Ribbon能干什么 3.Ribbon现状 4.未来替代方案 5.架构说明 二.RestTemplate 用法详解 三.Ribbon核心组件IRule 四. ...
- Spring Cloud Ribbon(服务消费者)
Spring Cloud Ribbon 是一个基于Http和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它几乎存在于每 ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- resttemplate 请求重试_使用Spring Cloud Ribbon重试请求
使用Spring Cloud Ribbon重试请求 在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调 ...
- java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现. 通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST ...
- Spring Cloud Ribbon –进行安全呼叫
很简单,但是最近我为此感到困惑 –我必须对安全的远程服务进行基于Netflix Ribbon的客户端调用. 事实证明,使用Netflix Ribbon可以通过两种方式实现这一点,我将通过Spring ...
最新文章
- DeepMind首席科学家:比起机器智能,我更担心人类智能造成的灾难
- 使用密钥验证方式登录linux系统
- Dubbo--zookeeper面试中问题解答
- 学计算机三本大学最低分数线,2018三本大学最低录取分数线是多少
- HTML中的IE条件注释
- 浅谈AQS同步队列(含ReentrantLock加锁和解锁源码分析)
- 时空行为检测数据集 JHMDB UCF101_24 详解
- 并行强化学习算法:A2C/A3C
- git add 后git reset --hard xxx的代码丢失,代码如何找回
- SIT1043 带唤醒及故障保护的低功耗CAN FD总线收发器 对标TJA1043
- 《2020智慧屏白皮书》重磅发布 华为跨界引领电视行业革新
- JavaScript,css时间计时器
- 蒋鑫鸿:9.2黄金原油跌势不止,日内操作策略
- 前后端分离的企业级微服务多租户系统架构,快速开发平台!
- wpf grid添加边框
- 基于STM32CUBEMX驱动多个VL6180X
- 组网胖模式_常听到别人说胖AP和瘦AP组网,都有什么区别呢?
- 使用一维数组输出最小值及其最大下标
- Linux驱动开发学习笔记-电容触摸屏驱动
- 什么软件测试显示屏好,显示器测试软件