1. 灰度发布

灰度发布是在多版本控制的基础上进一步扩展实现出来的项目 -> fm-cloud-graybunny,抽象出灰度服务、灰度服务实例、灰度策略、灰度决策等。

灰度策略可以从request ip, request patameter, request header等方面进行去创建,也可以根据bamboo的LoadBalanceRequestTrigger结合graybuanny的接口去扩展灰度策略和灰度决策。

  1. 场景

有两个服务,共四个服务实例,分别是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上。

    1. 思路

从上面的场景分析,可以归纳出两个对象:服务实例和调用请求;服务实例的灰度管理是基础,调用请求时如何决策路由,都是根据服务实例的灰度策略去判断的。既然有灰度管理这个概念,那么从功能上分,就会有client-server之分,所以又可以从graybunny-client和graybunny-server去分析。接下来将一步一步去分析这四个方面。

  1. 灰度实例

  • 实例注册
    服务实例添加到灰度管理中。
  • 实例下线
    服务实例下线,从灰度管理中删除。
  • 灰度开关
    调整服务实例的灰度状态,有启用、禁用两个状态,禁用的实例不纳入灰度列表中。
  • 灰度策略
    请求是否可以被转发到该服务实例的条件,只有通过,请求才有可能会被转发到该实例上。

    1. 调用请求

  • 灰度决策
    根据请求的信息去匹配灰度服务实例的灰度策略,如果匹配上,会将服务实例加入到通过列表中。如果都没有匹配上,就按bamboo的路由规则去筛选非灰度的服务实例进行转发。

    1. 灰度客户端

调用请求的服务消费者,和提供服务的服务提供者都可以是灰度客户端,因为微服务中,大多服务实例既是服务提供者,同时也是服务消费者。

  • 灰度服务注册
    服务实例在启动时,就会向灰度服务端发起请求,将实例自身的灰度开关打开。
  • 灰度服务下线
    在服务实例下线前,会触发钩子,向灰度服务端发起请求将实例自身从灰度列表中删除。
  • 接收灰度实例调整消息
    接收由灰度服务端推送过来的灰度列表更新消息比如新增灰度实例,删除灰度实例等,维护缓存在实例上的灰度列表。
  • 定时拉取灰度列表
    定时从灰度服务端拉取最新的灰度列表,维护实例自身缓存的灰度列表。

    1. 灰度服务端

灰度服务端负表维护灰度列表,可以新增、删除、编辑灰度信息。

  • 编辑灰度实例
    新增灰度实例,删除灰度实例,修改实例灰度状态。
  • 编辑灰度策略
    新增实例灰度策略,删除实例灰度策略,修改灰度策略状态。
  • 推送灰度服务调整消息
    向灰度客户端推送灰度列表变动消息,比如新增灰度实例,删除灰度实例,修改实例灰度状态等。
  • 定时检查服务实例是否下线
    定时检查灰度服务实例是否下线,下线的的实例将从灰度列表中删除。
  1. 代码设计

根据上面的思路,设计以下对象和接口。共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方式访问灰度服务端。
子类InformationClientDecorator是一个适配器类,RetryableInformationClient继承了InformationClientDecorator类,实现了重试的功能。

GrayDecision

该接口是灰度决策,用来判断请求是否匹配灰度策略。实现了ip匹配、request parameter匹配、request header匹配、BambooRequestContext中的参数匹配器以及合并匹配等多个匹配能力。

GrayDecisionFactory

灰度决策的工厂类,其默认实现类支持上述几种灰度决策的创建。

GrayServiceManager

灰度服务管理类,属于服务端的类。主要是编辑服务实例,编辑灰度策略,以及维护最新的灰度列表。

GrayBunnyServerEvictor

接口类

EurekaGrayBunnyServerEvictor

该类是GrayBunnyServerEvictor的具体实现类,如果灰度服务实例下线后, 由于意外情况,没有向灰度服务端发送删除请求,服务端会每隔一段时间调用该接口的方法,检查灰度列表中的实例是否下线,如果实例已下线,就将其从灰度列表中删除。EurekaGrayBunnyServerEvictor是依赖EurekaClient来检查服务实例是否下线。

  1. 灰度负载规则和灰度决策

类名称

描述

GrayLoadBalanceRule

该类继承多版本控制中的BambooZoneAvoidanceRule类,

灰度路由 :

灰度路由是客户端必须要实现的能力,graybunny是在bamboo的基础上扩展的,所以graybunny的路由规则对象GrayLoadBalanceRule继承了BambooZoneAvoidanceRule,choose()逻辑是这样的:

1、 判断目标服务是否有灰度实例。

1、 如果没有, 执行父类逻辑。结束。

2、 有灰度实例,先将灰度实例和非灰度实例筛选出来。

2、 挑选灰度实例, 筛选调用请求匹配上灰度实例的策略。

1、 如果没有匹配的灰度实例, 将非灰度实例列表传递过去执行父类的筛选逻辑。结束。

2、 如果有匹配的灰度实例, 从其中按轮询的方式挑选出一个实例。结束。

Spring cloud ribbon实现灰度发布相关推荐

  1. Spring Cloud 优雅下线+灰度发布

    前言 在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题.如果在我们升级服务的时候,会造成一段时间内的服务不可用,这就是不够优雅的.那什么是优雅的呢?主要就是指在服务升 ...

  2. 【305期】Spring Cloud 优雅下线+灰度发布

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 文章目录 ...

  3. Spring Cloud全链路灰度发布

    一.前言 实际生产中如有需求变更,并不会直接更新线上服务,最通常的做法便是:切出线上的小部分流量进行体验测试,经过测试后无问题则全面的上线.这样做的好处也是非常明显,一旦出现了BUG,能够保证大部分的 ...

  4. 3 Spring Cloud Ribbon

    Spring Cloud Ribbon Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具. Netflix Ribbon 是 Net ...

  5. Spring Cloud Ribbon的使用详解

    目录 一.概述 1.Ribbon是什么 2.Ribbon能干什么 3.Ribbon现状 4.未来替代方案 5.架构说明 二.RestTemplate 用法详解 三.Ribbon核心组件IRule 四. ...

  6. Spring Cloud Ribbon(服务消费者)

    Spring Cloud Ribbon 是一个基于Http和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它几乎存在于每 ...

  7. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡

    前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...

  8. resttemplate 请求重试_使用Spring Cloud Ribbon重试请求

    使用Spring Cloud Ribbon重试请求 在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调 ...

  9. java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Ribbon

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现. 通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST ...

  10. Spring Cloud Ribbon –进行安全呼叫

    很简单,但是最近我为此感到困惑 –我必须对安全的远程服务进行基于Netflix Ribbon的客户端调用. 事实证明,使用Netflix Ribbon可以通过两种方式实现这一点,我将通过Spring ...

最新文章

  1. DeepMind首席科学家:比起机器智能,我更担心人类智能造成的灾难
  2. 使用密钥验证方式登录linux系统
  3. Dubbo--zookeeper面试中问题解答
  4. 学计算机三本大学最低分数线,2018三本大学最低录取分数线是多少
  5. HTML中的IE条件注释
  6. 浅谈AQS同步队列(含ReentrantLock加锁和解锁源码分析)
  7. 时空行为检测数据集 JHMDB UCF101_24 详解
  8. 并行强化学习算法:A2C/A3C
  9. git add 后git reset --hard xxx的代码丢失,代码如何找回
  10. SIT1043 带唤醒及故障保护的低功耗CAN FD总线收发器 对标TJA1043
  11. 《2020智慧屏白皮书》重磅发布 华为跨界引领电视行业革新
  12. JavaScript,css时间计时器
  13. 蒋鑫鸿:9.2黄金原油跌势不止,日内操作策略
  14. 前后端分离的企业级微服务多租户系统架构,快速开发平台!
  15. wpf grid添加边框
  16. 基于STM32CUBEMX驱动多个VL6180X
  17. 组网胖模式_常听到别人说胖AP和瘦AP组网,都有什么区别呢?
  18. 使用一维数组输出最小值及其最大下标
  19. Linux驱动开发学习笔记-电容触摸屏驱动
  20. 什么软件测试显示屏好,显示器测试软件

热门文章

  1. 大地测量学基础(复习)第一部分
  2. 网络安全——终端安全
  3. PcShareVIP弄来的免杀思路
  4. [转载]注册电气工程师(供配电)执业资格考试基础考试大纲
  5. [160]八款最佳的远程桌面工具
  6. Latex 安装包 metropolis
  7. Elasticsearch检索分类深入详解—基础篇
  8. 对overflow与zoom”清除浮动”的一些认识
  9. python 会议室预约系统解决方案_会议预约系统_智能会议预约管理系统_轻松实现会议管理解决方案...
  10. elasticjob 源码分析