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);
}

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

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

相关文章

如何做好项目管理?年薪百万项目大佬一直在用这11张图!

日常工作中,我们会遇到各种大大小小的工作项目,如何能让项目保质保量的完成,就需要项目管理。项目管理是什么?一句话解释:在有限的时间内,在约束的范围中,集合有限资源来完成项目目标。 本周小编…

【深度学习】从现代C++中的开始:卷积

一、说明 在上一个故事中,我们介绍了机器学习的一些最相关的编码方面,例如 functional 规划、矢量化和线性代数规划。 本文,让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…

大学的python课程一般叫什么,大学开设python课程吗

大家好,小编为大家解答大学的python课程一般叫什么的问题。很多人还不知道大学python课有没有听的必要,现在让我们一起来看看吧! 1、华中农业大学python期末考试会考原题吗 华中农业大芦如学python期末考试不会考原题。华中农业搜侍大学pyth…

OpenCV图像处理-图像分割-MeanShift

MeanShift 1. 基本概念2.代码示例 1. 基本概念 MeanShift严格说来并不是用来对图像进行分割的,而是在色彩层面的平滑滤波。它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的的颜色区域,它以图像上任意一点P为圆心&…

CSS :nth-child

CSS :nth-child :nth-child 伪类根据元素在同级元素中的位置来匹配元素. CSS :nth-child 语法 值是关键词 odd/evenAnB最新的 [of S] 语法权重 浏览器兼容性 很简单的例子, 来直觉上理解这个伪类的意思 <ul><li class"me">Apple</li><li>B…

MySQL 服务器的调优策略

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 在工作中&#xff0c;我们发现慢查询一般有2个途径&#xff0c;一个是被动的&#xff0c;一个是主动的。被动的是当业务人员反馈某个查询界面响应的时间特别长&#xff0c;你才去处理。主动的是通过通过分析慢查询…

在Microsoft Excel中如何快速合并表格

在 Excel 中分析数据时&#xff0c;在一个工作表中收集所有必要信息的频率是多少&#xff1f;几乎从来没有&#xff01;当不同的数据分散在许多工作表和工作簿中时&#xff0c;这是一种非常常见的情况。幸运的是&#xff0c;有几种不同的方法可以将多个表中的数据组合成一个表&…

垃圾回收之三色标记法(Tri-color Marking)

关于垃圾回收算法&#xff0c;基本就是那么几种&#xff1a;标记-清除、标记-复制、标记-整理。在此基础上可以增加分代&#xff08;新生代/老年代&#xff09;&#xff0c;每代采取不同的回收算法&#xff0c;以提高整体的分配和回收效率。 无论使用哪种算法&#xff0c;标记…

C# OpenCvSharpe 二值化工具 阈值 自适应阈值 局部阈值 InRange

效果 阈值 自适应阈值 局部阈值 InRange 项目 VS2010.net4.0OpenCvSharper3 Demo下载

AWS / VPC 云流量监控

由于安全性、数据现代化、增长、灵活性和成本等原因促使更多企业迁移到云&#xff0c;将数据存储在本地的组织正在使用云来存储其重要数据。亚马逊网络服务&#xff08;AWS&#xff09;仍然是最受追捧和需求的服务之一&#xff0c;而亚马逊虚拟私有云&#xff08;VPC&#xff0…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

趋动科技携手星辰天合,推出针对人工智能领域的两款联合解决方案

近日&#xff0c;趋动科技与 XSKY星辰天合联合宣布&#xff0c;结合双方优势能力和产品&#xff0c;携手推出高性能数据湖一站式方案及全协议存算一体化方案&#xff0c;帮助客户简化 AI 工作的 IT 基础设施部署&#xff0c;实现 AI 相关工作更加灵活和便捷。 全协议存算一体化…

janus-Gateway的服务端部署

janus-Gateway 需求是前后端的webRTC推拉流&#xff0c;但是后端用的是c&#xff0c;于是使用了这个库做视频流的推送和拉取&#xff0c;记录踩坑过程。 如果你也需要自己部署janus的服务端并在前端拉流测试&#xff0c;希望对你有所帮助。 由于janus的服务器搭建需要linux环境…

向npm注册中心发布包(上)

目录 1、创建package.json文件 1.1 fields 字段 1.2 Author 字段 1.3 创建 package.json 文件 1.4 自定义 package.json 的问题 1.5 从当前目录提取的默认值 1.6 通过init命令设置配置选项 2、创建Node.js 模块 2.1 创建一个package.json 文件 2.2 创建在另一个应用程…

5G时代的APP开发:机遇与挑战

APP开发是互联网行业中的重要组成部分&#xff0c;随着5G时代的到来&#xff0c;移动 APP开发也迎来了新的机遇和挑战。 5G时代不仅会为移动 APP开发带来新的发展机遇&#xff0c;也会给移动 APP开发带来新的挑战。对于企业和开发者而言&#xff0c;5G时代带来的机遇和挑战是并…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境5

#尝试搭建K210的Micropython开发环境&#xff08;Win10&#xff09; #实验程序之三&#xff1a;更新频率演示 #尝试搭建K210的Micropython开发环境&#xff08;Win10&#xff09; #实验程序之三&#xff1a;更新频率演示from Maix import freqcpu_freq, kpu_freq freq.get() …

redis数据库与主从复制

目录 一 基本操作 二 执行流程 三 reids持久化 四 rdb和aof持久化的过程 五 为什么会有内存碎片 六 redis组从复制 一 基本操作 set :存放数据 例如 set 键值 内容 set k kokoko k就是键值 kokoko就是内容 get:获取数据 例如 get k 就会出来 k对应的数据 keys 查询键…

SFP3012A-ASEMI代理海矽美(MHCHXM)快恢复二极管

编辑&#xff1a;ll SFP3012A-ASEMI代理海矽美&#xff08;MHCHXM&#xff09;快恢复二极管 型号&#xff1a;SFP3012A 品牌&#xff1a;ASEMI 芯片个数&#xff1a;1 芯片尺寸&#xff1a;102MIL*2 封装&#xff1a;TO-247AC 恢复时间&#xff1a;75ns 工作温度&#…

开源快速开发平台:做好数据管理,实现流程化办公!

做好数据管理&#xff0c;可以提升企业的办公协作效率&#xff0c;实现数字化转型。开源快速开发平台是深受企业喜爱的低代码开发平台&#xff0c;拥有多项典型功能&#xff0c;是可以打造自主可控快速开发平台&#xff0c;实现一对一框架定制的软件平台。在快节奏的社会中&…

【亲测可用】Linux上安装Redis教程

一、下载并解压Redis 1、执行下面的命令下载redis&#xff1a; wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis&#xff1a; tar xzf redis-6.2.6.tar.gz 3、移动redis目录&#xff0c;一般都会将redis目录放置到 /usr/local/redis目录&#xff1a…