当前位置: 首页 > news >正文

SpringCloudAlibaba微服务实战系列(四)Sentinel熔断降级、异常fallback、block细致处理

SpringCloudAlibaba Sentinel降级和熔断

接着上篇文章的内容,在Sentinel中如何进行降级和熔断呢?

熔断降级规则

降级规则

在Sentinel中降级主要有三个策略:RT、异常比例、异常数,也是针对某个资源的设置。而在1.8.0+版本后RT改为了慢调用比例

需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

RT:表示该资源1s内处理请求的平均响应时间。

注意:RT值的上限时4900ms,及时超过也是4900ms,如需自定义,可以在启动sentinel时增加参数

-Dcsp.sentinel.statistic.max.rt=x

慢调用比例

依旧是在簇点链路的列表视图选择/sentinelTest一行,进入熔断,设置参数如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGUoQXMY-1690077568501)(../imgs3/1.png)]

RT设置为800ms,熔断时长设置为20s,为了测试效果,把接口睡眠1s。

@RequestMapping("/sentinelTest")
public String sentinelTest() throws InterruptedException {Thread.sleep(1000);return "sentinel-consumer9001 sentinelTest" + RandomUtils.nextInt(0, 1000);
}

解读:响应时间超过RT值的请求被称为慢调用。在单位时间(上图的统计时长1s)内,请求的数量大于最小请求数(5),且慢调用的比例>=阈值,此资源进入熔断状态(20s内不可用)。

Jmeter请求/sentinelTest,使用10个线程执行100次结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10RfprgA-1690077568503)(../imgs3/2.png)]

前面几个请求是正常返回数据,后面全部降级处理,直接返回提示信息(此时该资源已经进入了熔断状态,可以理解为家里的电闸给关了,必须重新打开电闸,才能恢复使用电力)。后面这个资源无论怎样被调用,都无法进入接口,直接返回提示。

异常比例

当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%

表示请求该资源的异常总数占比。先模拟一个异常

@RequestMapping("/sentinelTest")
public String sentinelTest() {int i = 1 / 0;	// 除数为0return "sentinel-consumer9001 sentinelTest" + RandomUtils.nextInt(0, 1000);
}

设置规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kviEhxbh-1690077568503)(../imgs3/3.png)]

解读:当1s内,请求数量>5,且异常的比例大于80%,熔断20s

调用资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c5jTOk65-1690077568504)(../imgs3/4.png)]

前几个请求正常请求返回异常提示,而后面的所有请求直接被拒绝访问。

异常数

该资源近1分钟内的异常数量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1q8O3llS-1690077568504)(../imgs3/5.png)]

解读:当1s内,请求数量>5,且异常的数量>=10,熔断20s

经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZyC2RzK-1690077568505)(../imgs3/6.png)]

当到11个请求仍然是异常时,直接熔断。

系统规则

之前的所有规则都是针对某个资源(接口)而言的,后面我们将针对整个应用设置系统规则。相对更加粗粒度,属于应用级别的入口流量控制。那么相对应的也有几种规则:

  • LOAD:负载,当系统负载超过设定值,且发现线程数超过预估系统容量就会触发保护机制。
  • RT:整个应用上所有资源平均的响应时间,而不是固定某个资源
  • 线程数:设定整个系统所能使用的业务线程数阈值,不固定某个资源
  • 入口QPS:整个应用所有的每秒处理的请求数
  • CPU使用率:这个应用占用的CPU的百分比

使用时可以根据服务器的情况设置即可。

授权规则

授权规则是根据调用方判断调用资源的请求是否应该被允许访问。Sentinel提供了黑白名单的授权类型,白名单表示允许调用资源,黑名单则不允许调用资源。

在java中实现相关的接口,将返回值交给sentinel处理。(注意:这里是在服务提供者方设置的

@Component
public class CustomRequestOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String origin = httpServletRequest.getParameter("origin"); // 区分来源,本质通过request域获取来源标识if (StringUtils.isEmpty(origin)) {throw new RuntimeException("origin不能为空");}return origin; // 将返回的结果交给sentinel处理}
}

然后配置个授权规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qZlV3SQw-1690077568506)(../imgs3/7.png)]

资源名/test设置app为黑名单

当请求provider服务上的接口时,若origin为空则会被拒绝访问,若origin=app时仍会被拒绝,而其他的值则是可以访问

D:\springcloud\doc>curl localhost:8002/test?origin=app
==>Blocked by Sentinel (flow limiting)
D:\springcloud\doc>curl localhost:8002/test?origin=pc
==>sentinel-provider8002 test()921

使用@SentinelResource注解

之前主要是利用Sentinel仪表板控制一些参数保护应用。后面我们使用@SentinelResource注解根据实际情况实现定制化功能,对应用的保护更加细粒度。

现在限制达到阈值时,直接提示Blocked by Sentinel(flow limiting),提示不太友好,需要实现更精细化的控制。

blockHandler属性–负责响应控制面板配置

添加一个接口/blockHandlerTest资源名为blockHandlerTest,如果违反Sentinel控制台的规则,则进入blockHandlerTestHander。

@RequestMapping("/blockHandlerTest")
@SentinelResource(value = "blockHandlerTest", blockHandler = "blockHandlerTestHandler")
public String blockHandlerTest(String params) {return "Test#blockHandlerTest" + RandomUtils.nextInt(0, 1000);
}public String blockHandlerTestHandler(String params, BlockException bl) {return "Test#blockHandlerTest" + RandomUtils.nextInt(0, 1000) + bl.getMessage();
}

注意:blockHandlerTestHandler方法的返回值要和原方法一致,并且除了原有的参数,还要带上BlockException的参数

设置一个流控,在@SentinelResouce注解中我们把资源名设置为blockHandlerTest,那么设置流控也是针对这个资源设置,让后面的请求进入我们自定义的处理中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3ZqQxww-1690077568506)(../imgs3/8.png)]

可以看到,流控超过阈值后,其他的所有请求都是走的我们自定义的处理器。

热点规则

在一段时间内访问很频繁的资源是热点资源,需要针对资源做参数化定制。

@RequestMapping("/testHotKeyA")
@SentinelResource(value = "testHotKeyA", blockHandler = "blockTestHotKeyA")
public String testHotKeyA(@RequestParam(value = "orderId", required = false) String orderId,@RequestParam(value = "userId", required = false) String userId) {return "Test#testHotKeyA" + RandomUtils.nextInt(0, 1000);
}public String blockTestHotKeyA(String orderId, String userId, BlockException bl) {return "Test#blockTestHotKeyA" + RandomUtils.nextInt(0, 1000) + bl.getMessage();
}

去sentinel页面上加一个热点key规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tPEIErRB-1690077568507)(../imgs3/9.png)]

索引从0开始,那么获取的就是我们的orderId参数,在调用/testHotKeyA时要加上oderId参数否则不生效。

在这里插入图片描述

正确进入处理。

同时,我们可以对热点资源具体的某个参数值做阈值限制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WeFEBvdq-1690077568508)(../imgs3/11.png)]

上图是对orderId为111或222时,阈值设置为500.再次测试,基本上不会进入自定义的处理中。但是为其他值时还是会进入我们的自定义处理。

fallback处理

前面是针对违反sentinel控制台规则做的处理,那么当我们的业务层面出现问题时,要做异常回滚等,则要使用fallback处理。同样是@SentinelResource中的属性。sentinel-1.6.0之前的版本是不支持针对业务异常处理的

@RequestMapping("/fallbackTest")
@SentinelResource(value = "fallbackTest", fallback = "fallbackHandler")
public String fallbackTest(String params) {int i = 1 / 0;return "Test#fallbackTest" + RandomUtils.nextInt(0, 1000);
}public String fallbackHandler(String params) {return "Test#fallbackHandler" + RandomUtils.nextInt(0, 1000);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGmfv2T9-1690077568508)(../imgs3/12.png)]

所有的请求都进入到异常处理的方法中了。

fallback+blockHandler

@RequestMapping("/sentinelUnionTest")
@SentinelResource(value = "sentinelUnionTest", fallback = "sentinelUnionTestFallback", blockHandler = "sentinelUnionTestBlockHandler")
public String sentinelUnionTest(String params) {int i = 1 / 0;return "Test#fallbackTest" + RandomUtils.nextInt(0, 1000);
}public String sentinelUnionTestFallback(String params) {return "Test#sentinelUnionTestFallback" + RandomUtils.nextInt(0, 1000);
}public String sentinelUnionTestBlockHandler(String params, BlockException bl) {return "Test#sentinelUnionTestBlockHandler" + RandomUtils.nextInt(0, 1000) + bl.getMessage();
}

sentinelUnionTest资源设置流控,调用接口观察结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nP7LNAIb-1690077568509)(../imgs3/14.png)]

第一个接口是正常进入到了fallback处理,然后后面的请求因为超过阈值,直接进入block处理中了。

忽略异常–exceptionsToIngnore

fallback定义的方法可以针对所有类型的异常,我们也可以忽略某些异常。

@RequestMapping("/fallbackTest")
@SentinelResource(value = "fallbackTest", fallback = "fallbackHandler", exceptionsToIgnore = ArithmeticException.class)
public String fallbackTest(String params) {int i = 1 / 0;return "Test#fallbackTest" + RandomUtils.nextInt(0, 1000);
}public String fallbackHandler(String params) {return "Test#fallbackHandler" + RandomUtils.nextInt(0, 1000);
}

模拟了一个计算异常,但是此异常被忽略了,所以不会进入到fallbackHandler中进行处理,而是直接jvm抛异常给客户端响应。

代码优化

前面的代码中都是把fallback和block全都写在了一起,这样是不符合程序单一性原则的,毕竟controller层有很多之外的逻辑,二来别的类也不好复用。

sentinel考虑到这些情况,在@SentinelResource中有blockHandlerClassfallbackClass。顾名思义,blockHandlerClass中写blockHandler函数,fallbackClass中写fallback的函数。

// 异常fallback
public class ExceptionHandler {public static String sentinelTestFallback(String params) {return "testCon#sentinelTestFallback" + RandomUtils.nextInt(0, 1000);}
}
// blockHandler处理
public class BlockHandler {public static String sentinelBlock(String params, BlockException e) {return "testCon#sentinelBlock" + RandomUtils.nextInt(0, 1000);}
}

两个类中的方法必须是static 修饰的,且参数要和原方法保持一致,否则无法解析噢

接口原方法

@RequestMapping("/sentinelUnionTest")
@SentinelResource(value = "sentinelUnionTest",fallbackClass = ExceptionHandler.class, fallback = "sentinelTestFallback",  // 指定类和方法名blockHandlerClass = BlockHandler.class, blockHandler = "sentinelBlock")     // 指定类和方法名
public String sentinelUnionTest(String params) {int i = 1 / 0;return "Test#fallbackTest" + RandomUtils.nextInt(0, 1000);
}

相关文章:

SpringCloudAlibaba微服务实战系列(四)Sentinel熔断降级、异常fallback、block细致处理

SpringCloudAlibaba Sentinel降级和熔断 接着上篇文章的内容,在Sentinel中如何进行降级和熔断呢? 熔断降级规则 降级规则 在Sentinel中降级主要有三个策略:RT、异常比例、异常数,也是针对某个资源的设置。而在1.8.0版本后RT改为…...

WebDAV之π-Disk派盘+ WinSCP

WinSCP是一个免费的开源文件传输应用程序,它使用文件传输协议,安全外壳文件传输协议和安全复制协议来进行纯文件或安全文件传输。该应用程序旨在与Windows一起使用,并支持常见的Windows桌面功能,例如拖放文件,跳转列表…...

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用Python图像处理库Pillow,帮助大家进一步了解Python的基本概念:模块、对象、方法和函数的使用 使用Python语言解决实际问题时,往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理…...

音视频——压缩原理

H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛, 最流行的。随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本。 但为了用好H264,我们还是要对…...

微服务 云原生:搭建 K8S 集群

为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。 基础准备 关…...

C++中的数学问题---进制转换

二进制转十六进制 string binToHex(string bin){string hex"";if(bin.size()%4!0){for(int i0;i<(4-bin.size()%4);i){bin"0"bin;}}for(int i0;i<bin.size();i4){string tmpbin.substr(i,4);bitset<4>b(tmp);hexb.to_ulong()<10?char(b.t…...

开发一个RISC-V上的操作系统(三)—— 串口驱动程序(UART)

目录 文章传送门 一、什么是串口 二、本项目串口的FPGA实现 三、串口驱动程序的编写 四、上板测试 文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&…...

nuxt项目部署,npm run build 和npm run generate的区别

每日鸡汤&#xff1a;每个你想要学习的瞬间都是未来的你向自己求救 非服务端渲染的项目&#xff0c;比如普通的vite vue项目&#xff0c;我们在部署生产环境的时候&#xff0c;只需要两步 运行 npm run build 然后得到了一个 dist 文件夹将这个dist文件夹部署到一个静态服务器…...

数据仓库设计理论

数据仓库设计理论 一、数据仓库基本概念 1.1、数据仓库介绍 数据仓库是一个用于集成、存储和分析大量结构化和非结构化数据的中心化数据存储系统。它旨在支持企业的决策制定和业务分析活动。 1.2、基本特征 主题导向&#xff1a;数据仓库围绕特定的主题或业务领域进行建模…...

数据接口有哪些?(数据接口有哪几种)

数据接口是指不同应用程序或系统之间交换数据的通信界面。在现代信息化社会中&#xff0c;数据接口扮演着极为重要的角色&#xff0c;它们使得不同平台之间能够相互连接和交流&#xff0c;从而实现数据共享和应用集成。 数据接口的种类繁多&#xff0c;常见的有以下几种&#…...

华为云CodeArts产品体验的心得体会及想法

文章目录 前言CodeArts 的产品优势一站式软件开发生产线研发安全Built-In华为多年研发实践能力及规范外溢高质高效敏捷交付 功能特性说明体验感受问题描述完结 前言 华为云作为一家全球领先的云计算服务提供商&#xff0c;致力于为企业和个人用户提供高效、安全、可靠的云服务。…...

下载安装:SQLite+SQLiteStudio+VS

目录 1、SQLite 1.1、下载SQLite 1.2、配置SQLite的环境变量 2、SQLite Studio 2.1、下载SQLite Studio 2.2、安装SQLite Studio 3、Visual Studio 3.1、下载Visual Studio 3.2、安装Visual Studio 1、SQLite 1.1、下载SQLite SQLite官网&#xff1a;SQLite Downl…...

nginx路由

一般我们经常在访问网站时&#xff0c;通常会遇到输入某个页面的网址时&#xff0c;出现路由的转发&#xff0c;重定向等。可能访问的是一个网址&#xff0c;出来的时候就显示的是另外的地址。这是由于使用了nginx的缘故&#xff0c;保护了网址的安全性 &#xff08;1&#xf…...

MobPush Android SDK 厂商推送限制

概述 厂商推送限制 每个厂商通道都有对应的厂商配额和 QPS 限制&#xff0c;当请求超过限制且已配置厂商回执时&#xff0c;MobPush会采取以下措施&#xff1a; 当开发者推送请求超过厂商配额时&#xff0c;MobPush将通过自有通道进行消息下发。当开发者推送请求超过厂商 QP…...

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

目录 network 和 NetworkManager关系&#xff1a; 实验&#xff1a;编写一个扫描脚本&#xff0c;知道本局域网里哪些ip在使用&#xff0c;哪些没有使用&#xff1f; 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式&#xff1a; shell语言编写扫描脚本 …...

gitee 配置ssh 公钥(私钥)

步骤1&#xff1a;添加/生成SSH公钥&#xff0c;码云提供了基于SSH协议的Git服务&#xff0c;在使用SSH协议访问项目仓库之前&#xff0c;需要先配置好账户/项目的SSH公钥。 绑定账户邮箱&#xff1a; git config --global user.name "Your Name" git config --glob…...

JAVA面试总结-Redis篇章(七)——数据淘汰策略

JAVA 面试总结-数据淘汰策略...

[SQL挖掘机] - 算术函数 - round

介绍: 当谈到 SQL 中的 round 函数时&#xff0c;它用于将一个数值四舍五入到指定的小数位数。 用法: round 函数的用法如下&#xff1a; round(number, decimals)其中&#xff0c;number 是要进行四舍五入的数值&#xff0c;decimals 是要保留的小数位数。round 函数接受两…...

php-golang-rpc spiral/goridge库和php spiral/goridge2.4.5实践

golang 代码&#xff1a; package main import ( "fmt" "net" "net/rpc" "github.com/spiral/goridge/v2" ) type App struct{} func (*App) Hi(name string, r *string) error { *r fmt.Sprintf("hello %s!", name) re…...

关于Kubernetes的一些零碎想法

关于Kubernetes的一些零碎想法 容器集群管理系统与容器编排系统 很多使用Kubernetes的企业可能没有认识到Kubernetes最重要的特点。许多企业将其视为一种容器集群管理系统&#xff08;container management system&#xff09;&#xff0c;只使用其管理容器的能力。然而&#x…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...