【RuoYi-Cloud-Plus】学习笔记 09 - Sentinel(四)熔断降级知识整理

news2024/11/25 12:25:29

文章目录

    • 前言
    • 参考目录
    • 版本说明
    • 学习笔记
      • 1、包结构
      • 2、`DegradeSlot`
      • 3、`DegradeRule`
      • 4、`DegradeRuleManager`
      • 5、`CircuitBreaker`
      • 5.1 `CircuitBreaker.State`
      • 6、`AbstractCircuitBreaker`
      • 6.1、`AbstractCircuitBreaker#fromCloseToOpen`
      • 6.2、`AbstractCircuitBreaker#fromHalfOpenToOpen`
      • 6.3、`AbstractCircuitBreaker#fromHalfOpenToClose`
      • 6.4、`AbstractCircuitBreaker#fromOpenToHalfOpen`
      • 7、`CircuitBreakerStrategy`
      • 8、`ExceptionCircuitBreaker`
      • 9、`ResponseTimeCircuitBreaker`
      • 10、`CircuitBreakerStateChangeObserver`

前言

本文的开篇直接引用 Sentinel 官方 wiki 的描述进行说明:

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

在这段文字中很好地说明了熔断降级的使用场景以及作用,结合《实战Alibaba Sentinel:深度解析微服务高并发流量治理》第6章的内容,本文做了一些知识整理。

参考目录

  • Sentinel 官方文档
  • 熔断降级
  • 《实战Alibaba Sentinel:深度解析微服务高并发流量治理》
    本文依托于书本第6章内容进行下文断路器部分的展开。

版本说明

  • SentinelV1.8.6

学习笔记

1、包结构

Sentinel 关于熔断降级功能的主要包结构如下:

在这里插入图片描述

按照功能我简单整理成了表格:

类名类型说明
DegradeSlotclass熔断插槽
DegradeRuleclass熔断规则对象
DegradeRuleManagerclass熔断规则管理器
DegradeRuleManager.RulePropertyListenerprivate class熔断规则管理器.规则属性监听器
DegradeExceptionexception class熔断异常类
CircuitBreakerinterface断路器接口
CircuitBreaker.Stateenum断路器状态枚举
AbstractCircuitBreakerabstract class抽象断路器
CircuitBreakerStrategyenum断路器策略枚举
ExceptionCircuitBreakerclass异常断路器
ResponseTimeCircuitBreakerclass响应时间断路器(慢请求断路器)
CircuitBreakerStateChangeObserverinterface断路器状态改变观察者
EventObserverRegistryclass断路器事件观察者注册表

下文将按照这个表格的顺序对相关类进行说明。

2、DegradeSlot

这是在 Sentinel 核心调用链路的插槽之一。

这个 slot 主要针对资源的平均响应时间(RT)以及异常比率,来决定资源是否在接下来的时间被自动熔断掉。

跟其他 slot 一样实现了 entry 以及 exit 方法。

DegradeSlot#entry
在这里插入图片描述

slot 入口方法逻辑比较简单:

  1. 根据资源名称从熔断规则管理器中获取所有的断路器。
  2. 如果没有断路器直接返回。
  3. 遍历所有断路器:
    • 根据上下文进行断路器校验,如果校验不通过则抛出降级异常。

DegradeSlot#exit
在这里插入图片描述

在该方法中,如果请求执行没有异常,则再次遍历所有断路器并依次执行完成记录以及改变相关状态。

关于 CircuitBreaker#onRequestComplete 方法会在后文展开说明。

3、DegradeRule

在这里插入图片描述

关于对象属性的说明:

在这里插入图片描述

4、DegradeRuleManager

在这里插入图片描述

构建断路器方法:

DegradeRuleManager.RulePropertyListener#buildCircuitBreakers
在这里插入图片描述

DegradeRuleManager#getExistingSameCbOrNew
在这里插入图片描述

根据不同的降级策略创建不同的断路器。

5、CircuitBreaker

在这里插入图片描述

接口继承关系:

在这里插入图片描述

主要的实现类有三个:

  • 抽象断路器 AbstractCircuitBreaker
  • 响应时间断路器(慢请求断路器)ResponseTimeCircuitBreaker
  • 异常断路器 ExceptionCircuitBreaker

抽象断路器主要实现了方法:getRuletryPasscurrentState;另外两个策略断路器主要实现的是 onRequestComplete

在这里插入图片描述

5.1 CircuitBreaker.State

CircuitBreaker.State 枚举可知,断路器共有三种状态:

  • OPEN 开启状态
  • HALF_OPEN 半开启状态
  • CLOSED 关闭状态

根据书中的描述,我重新整理绘制了一下关于状态转换的图片:

在这里插入图片描述

断路器状态转换的具体方法都在抽象断路器 AbstractCircuitBreaker 中实现。

6、AbstractCircuitBreaker

关于抽象断路器的概述:

虽然不同熔断降级策略的熔断器实现逻辑不同,但差异只是阈值的判断不同或需要统计的指标数据不同,而是否放行请求只需要根据当前熔断器的状态判断,因此,Sentinel为不同熔断降级策略的熔断器提供了一个统一的抽象类——AbstractCircuitBreaker。

除了实现接口中的方法,抽象断路器定义了断路器状态转换的方法。

在这里插入图片描述

需要注意的是,断路器状态无法直接从开启状态到关闭状态,因此有四个状态转换方法:

  • fromCloseToOpen 从关闭到开启
  • fromHalfOpenToOpen 从半开启到开启
  • fromHalfOpenToClose 从半开启到关闭
  • fromOpenToHalfOpen 从开启到半开启

6.1、AbstractCircuitBreaker#fromCloseToOpen

在这里插入图片描述

• 方法参数为触发值,即达到阈值时触发熔断器开启的当前值。
• 方法可实现开启熔断器,更新下一次允许将熔断器关闭的时间,并通知状态改变观察者。

6.2、AbstractCircuitBreaker#fromHalfOpenToOpen

在这里插入图片描述

• 方法参数为触发值,即达到阈值时触发熔断器开启的当前值。
• 方法可实现开启熔断器,更新下一次允许将熔断器关闭的时间,并通知状态改变观察者。

6.3、AbstractCircuitBreaker#fromHalfOpenToClose

在这里插入图片描述

该方法可实现关闭熔断器并重置滑动窗口,重新统计熔断指标数据,最后通知状态改变观察者。其中调用的resetStat方法是一个抽象方法,由子类实现,用于重置滑动窗口。

6.4、AbstractCircuitBreaker#fromOpenToHalfOpen

在这里插入图片描述

• 方法参数为调用链上下文。
• 方法可实现将熔断器从 OPEN 状态变为 HALF_OPEN 状态,先通知状态改变观察者,再从 Context 实例中获取当前资源的 Entry 实例,向 Entry 实例注册一个 exit 回调处理器。该处理器在 Entry 实例的 exit 方法被调用时回调。
• exit 回调处理器实现:如果当前请求被拒绝(不仅包括熔断器拒绝的,也包括限流、系统自适应等拒绝的),将熔断器从 HALF_OPEN 状态变为 OPEN 状态。

在该方法中,提出并解答了这个问题:

思考:为什么要在fromOpenToHalfOpen方法中注册exit回调处理器?

在这里插入图片描述

在这里插入图片描述

7、CircuitBreakerStrategy

在讲具体的断路器前,先来看看熔断策略。

在这里插入图片描述

在这里插入图片描述

三种熔断策略,对应两种不同的断路器,下面来看看具体的实现。

8、ExceptionCircuitBreaker

异常熔断器用于实现ERROR_RATIO、ERROR_COUNT这两种熔断降级策略,因此异常熔断器关心的是异常指标数据。

ExceptionCircuitBreaker#onRequestComplete
在这里插入图片描述

ExceptionCircuitBreaker#handleStateChangeWhenThresholdExceeded
在这里插入图片描述

该方法的主要逻辑(对应图中的说明):

  1. 断路器开启状态,直接返回
  2. 断路器半开启状态:
    • 如果执行没有异常,关闭断路器
    • 如果执行有异常,打开断路器
  3. 计算请求异常数以及请求总数
  4. 如果总数 < 最小请求数,直接返回
  5. 如果降级策略为异常比例,则计算当前异常比例值
  6. 判断是否超过设定阈值,如果是则打开断路器

达到阈值后打开断路器的方法也是在抽象断路器中定义的:

AbstractCircuitBreaker#transformToOpen
在这里插入图片描述

9、ResponseTimeCircuitBreaker

慢请求熔断器用于实现SLOW_REQUEST_RATIO熔断策略,因此慢请求熔断器关心的是耗时指标数据。

ResponseTimeCircuitBreaker#onRequestComplete
在这里插入图片描述

ResponseTimeCircuitBreaker#handleStateChangeWhenThresholdExceeded
在这里插入图片描述

该方法的主要逻辑(对应图中的说明):

  1. 断路器开启状态,直接返回
  2. 断路器半开启状态:
    • 如果当前请求是慢请求(RT 大于最大允许值),打开断路器
    • 如果当前请求不是慢请求,关闭断路器
  3. 计算慢请求数以及请求总数
  4. 如果总数 < 最小请求数,直接返回
  5. 计算当前慢请求比例值
  6. 判断当前慢请求比例值是否超过设定阈值,如果是则打开断路器
  7. 判断当前慢请求比例是否等于设定阈值且设定阈值等于慢请求比例最大值,如果是则打开断路器

10、CircuitBreakerStateChangeObserver

在这里插入图片描述

AbstractCircuitBreaker#notifyObservers
在这里插入图片描述

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/743203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0127 进程与线程1

目录 2.进程与线程 2.1进程与线程 2.1部分习题 2.2处理机调度 2.2部分习题 2.进程与线程 2.1进程与线程 2.1部分习题 1.一个进程的映像是&#xff08;&#xff09; A.由协处理器执行的一个程序 B.一个独立的程序数据集 C.PCB结构与程序和数据的组合 D.…

运动控制--双S型 + PID

运动控制--双S型 PID 1 介绍1.1 概述1.2 梯形速度曲线 VS 双S型速度曲线 2 运动控制器2.1 运动控制器的构成2.2 轨迹生成器2.3 插补器2.4 控制回路 3 PID4 双 S 型4.1 介绍4.2 双S模型&#xff08;7段S型&#xff09;规划参数算法公式轨迹分类 5 多种速度规划对比 【引用 Marc…

计算机网络基础第一章

一、计算机网络的概念及功能 1.1 计算机网络的概念 三网&#xff1a;有线电视网络、电信网络、计算机网络。 三网融合&#xff1a;通过计算机网络可以将有线电视、电信网络通过0/1编码等方式展现进行融合&#xff0c;从而实现计算机网络实现视频、电话等其他网络功能。 四网&a…

git推送出现问题error: remote origin already exists.(解决)

阿丹&#xff1a; 推送git的时候出现问题&#xff0c; 报错remote orign already exists这个错误 错误原因 可能是因为clone下来一个别人的仓库&#xff0c;在此基础上完成你的代码&#xff0c;推送到自己的仓库可能遇到如下问题&#xff1a; error: remote origin already e…

Ubuntu 放弃了战斗向微软投降

导读这几天看到 Ubuntu 放弃 Unity 和 Mir 开发&#xff0c;转向 Gnome 作为默认桌面环境的新闻&#xff0c;作为一个Linux十几年的老兵和Linux桌面的开发者&#xff0c;内心颇感良多。Ubuntu 做为全世界Linux界的桌面先驱者和创新者&#xff0c;突然宣布放弃自己多年开发的Uni…

SSM+Shiro安全框架整合(完成安全认证--登录+权限授权)+ssm整合shiro前后端分离

目录 1.搭建SSM框架 1.1.引入相关的依赖 1.2. spring配置文件 1.3. web.xml配置文件 1.4.配置Tomcat并启动 2.ssm整合shiro---认证功能 (1).引入依赖 (2).修改spring配置文件 (3).修改web.xml文件 (4).新建login.jsp(登录页面) (5).新建success.jsp(登录成功后跳转到此…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 列式数据是如何存储与处理的

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

VMware ESXi 7.0 U3n macOS Unlocker OEM BIOS (标准版和厂商定制版)

VMware ESXi 7.0 U3n macOS Unlocker & OEM BIOS (标准版和厂商定制版) ESXi 7.0 标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-oem/&#xff0c;查看…

第一代Spring Cloud核心组件

第一代Spring Cloud核心组件&#xff08;Spring Cloud Netflix&#xff09; Eureka服务注册中心(服务注册中心:Eureka,Nacos,Zookeeper,Consul) Ribbon负载均衡 Hystrix熔断器 Feign远程调用组件(Feign RestTemplate Ribbon Hystrix) GateWay网关组件 Config分布式配置中心 …

刘铁猛C#教程笔记——详解类型,变量,和对象第1节

强/弱类型语言 强类型语言&#xff1a;所谓强类型语言就是变量的值十分依赖变量的类型&#xff0c;也就是说假如一个变量其类型是整型&#xff0c;那么你在为该整型变量进行赋值的时候就不可以为其赋值一个字符串类型的常量&#xff0c;C#语言就是典型的强类型语言弱类型语言&…

C# 颠倒二进制位

190 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指定为有符号整数类型&#xff0c;并且不应影响您的…

微软MFC技术中的消息循环

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊微软MFC技术中的消息循环。 在很多windows程序中&#xff0c;都有如下代码&#xff1a; //Win32应用程序入口函数WinMain() int WINAPI WinMain(HINSTANCE hInstance, //指向当前实例的句柄…

全链路Python环境迁移

全链路Python环境迁移 在当前的Python环境中&#xff0c;安装一些库以后&#xff0c;如果换了一套Python环境&#xff0c;难道再来一次不停的pip install&#xff1f;当然不是。 第一步&#xff0c;使用pip freeze&#xff08;冻结&#xff09;备份当前Python库的环境 pip f…

《微服务架构设计模式》第六章 使用事件溯源开发业务逻辑

内容总结自《微服务架构设计模式》 使用事件溯源开发业务逻辑 一、传统持久化技术的问题二、什么是事件溯源三、好处和弊端四、实现事件存储库五、与Saga结合六、总结 一、传统持久化技术的问题 1、对象与关系的"阻抗失调" 所谓的对象与关系的“阻抗失调”是一个古…

ThreadLocal与InheritableThreadLocal及线程池的影响

在web开发中使用了ThreadLocal本地线程存储拦截器解析的用户信息&#xff0c;方便在下文代码中调用&#xff0c;但是在springboot中使用Async开启异步操作时&#xff0c;就会造成&#xff0c;子线程无法拿到父本地线程数据。拿到一些脏数据。 1.InheritableThreadLocal 在这个…

常用技巧总结

本文总结了本人在日常工作学习中遇到的问题及其解决方法&#xff0c;没有固定的涉及领域 目的就是为了在下一次遇到类似问题的时候方便查找&#xff0c;从而快速解决问题 本文不定时更新~ 目录 Windows使用 如何实现桌面图标随意排列 文件资源管理器相关 显示隐藏文件 修改…

深度学习06-深度卷积生成对抗网络(DCGAN)

文章目录 概述原理简介专业术语零填充转置卷积 生成动漫图像算力选择数据集目录规划源代码数据源加载定义配置类定义模型 训练可视化绘制损失绘制生成器图像变化 其他项目CycleGANstargan 概述 GAN&#xff08;Generative Adversarial Network&#xff09;是一种生成模型&…

flutter开发实战-日志logger写入文件及print

flutter开发实战-日志logger写入文件及print 在开发中&#xff0c;需要日志logger写入文件&#xff0c;方便日后查看出现的问题。这里记录之前的实现方案。 使用的日志插件是logger 一、引入日志插件 在工程中pubspec.yaml引入logger logger: ^1.4.0二、代码实现 使用比较…

听GPT 讲K8s源代码--pkg(一)

在 Kubernetes 代码仓库中&#xff0c;pkg/api和pkg/apis目录都包含用于定义 Kubernetes API 对象的代码&#xff0c;但它们的作用略有不同。 pkg/api目录包含 Kubernetes 的旧版本 API 对象定义&#xff0c;这些定义在 Kubernetes 1.7 版本之前使用。这些对象定义已经过时&…

第四课:Figma 图标设计

图形绘制小技巧 绘制正圆 O shift 正方体 R shift&#xff0c;右侧属性面板可调整描边显示方向&#xff0c;描边类型&#xff1b; 直线 L shift 带角度的箭头 shift L &#xff0c;按住 shift 键调整以 45 度角调整箭头方向&#xff0c;右侧属性面板可调节箭头方向和线条…