李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
04.Sentinel降级规则
Leefs
2023-01-17 PM
2157℃
0条
[TOC] ### 前言 本文档针对 Sentinel 1.8.0 及以上版本。1.8.0 版本对熔断降级特性进行了全新的改进升级。 *官网地址[:熔断降级](https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7)* ### 一、概述 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。 一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方API等。 例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。 然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。 ![04.Sentinel降级规则01.png](https://lilinchao.com/usr/uploads/2023/01/4051186565.png) 现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的**弱依赖服务调用**进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。 ### 二、熔断策略 **Sentinel 提供以下几种熔断策略**: - **慢调用比例 (`SLOW_REQUEST_RATIO`)**:选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(`statIntervalMs`)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 - **异常比例 (`ERROR_RATIO`)**:当单位统计时长(`statIntervalMs`)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 `[0.0, 1.0]`,代表 0% - 100%。 - **异常数 (`ERROR_COUNT`)**:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断 熔断降级规则(DegradeRule)包含下面几个重要的属性: | Field | 说明 | 默认值 | | :------------------: | :----------------------------------------------------------- | :--------- | | resource | 资源名,即规则的作用对象 | | | grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 | | count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | | | `timeWindow` | 熔断时长,单位为 s | | | `minRequestAmount` | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 | | `statIntervalMs` | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms | | `slowRatioThreshold` | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) | | ### 三、慢调用比例 > RT(平均响应时间,秒级) #### 3.1 概述 **慢调用比例 (SLOW_REQUEST_RATIO)**:选择以**慢调用比例作为阈值**,需要设置**允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用**。 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,**并且**慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 ![04.Sentinel降级规则02.jpg](https://lilinchao.com/usr/uploads/2023/01/407626052.jpg) #### 3.2 实战测试 + **业务类中增加`/testD`测试接口** ```java @GetMapping("/testD") public String testD() { //暂停1秒 try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("testD 测试慢调用比例 RT"); return "------tedtD"; } ``` + **设置熔断规则** > 在1000ms的统计时间内,总请求数(超过5次)中有80%的请求最大RT超过了200ms,那么触发熔断机制,熔断2s。 ![04.Sentinel降级规则03.jpg](https://lilinchao.com/usr/uploads/2023/01/1577260924.jpg) + **jmeter压测** (1)通过bin目录下的`jmeter.bat`文件启动jmeter (2)再测试计划下添加线程组 ![04.Sentinel降级规则04.jpg](https://lilinchao.com/usr/uploads/2023/01/2095259348.jpg) (3)在线程组下创建HTTP请求 ![04.Sentinel降级规则05.jpg](https://lilinchao.com/usr/uploads/2023/01/546833750.jpg) (4)运行线程组 ![04.Sentinel降级规则06.jpg](https://lilinchao.com/usr/uploads/2023/01/3069649192.jpg) + **浏览器访问`/testD`接口** ![04.Sentinel降级规则07.jpg](https://lilinchao.com/usr/uploads/2023/01/3892045681.jpg) 从访问接口可以看出`testD`被熔断了。 从实时监控也可以看到,在29的时候开始熔断。 ![04.Sentinel降级规则08.jpg](https://lilinchao.com/usr/uploads/2023/01/2618465119.jpg) **分析** 每秒钟10个线程进行访问(大于5个了)调用`/testD`接口,我们希望200毫秒处理完本次任务,如果超过200毫秒还没处理完,在未来的时间内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了。 后续停止`jmeter`,没有这么大的访问量了,断路器半开到关闭(保险丝恢复),微服务恢复OK。 ### 四、异常比例 #### 4.1 概述 **异常比例 (ERROR_RATIO)**:当单位统计时长(`statIntervalMs`)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。 ![04.Sentinel降级规则09.jpg](https://lilinchao.com/usr/uploads/2023/01/711537910.jpg) #### 4.2 实战测试 + **修改业务类** ```java @GetMapping("/testD") public String testD() { //暂停1秒 try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("testD 测试慢调用比例 RT"); int age = 10 / 0; //测试异常数比例 return "------tedtD"; } ``` + **设置熔断规则** > 1000ms统计时长内,大于5次的请求中超过80%的请求出现异常,则熔断2s ![04.Sentinel降级规则10.jpg](https://lilinchao.com/usr/uploads/2023/01/3336568549.jpg) + **jmeter压测** 开启jmeter后,直接高并发发送请求,多次调用达到熔断策略的配置条件。 断路器开启(保险丝跳闸),微服务不可用,不再报错error而是服务降级了。 ![04.Sentinel降级规则11.jpg](https://lilinchao.com/usr/uploads/2023/01/2578737181.jpg) ### 五、异常数 #### 5.1 概述 **异常数 (ERROR_COUNT)**:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。 ![04.Sentinel降级规则12.jpg](https://lilinchao.com/usr/uploads/2023/01/2397049926.jpg) #### 5.2 实战测试 + **修改业务类** ```java @GetMapping("/testE") public String testE() { log.info("testE 测试慢调用比例 RT"); int age = 10 / 0; //测试异常数比例 return "------testE"; } ``` + **设置熔断规则** > 统计时长1000ms内,超过5个请求中有超过3个请求出现异常,那么熔断5s ![04.Sentinel降级规则13.jpg](https://lilinchao.com/usr/uploads/2023/01/509185325.jpg) + **手动测试** ![04.Sentinel降级规则14.jpg](https://lilinchao.com/usr/uploads/2023/01/2070045454.jpg) 程序没有报错,直接被熔断了。
标签:
SpringCloudAlibaba
,
Sentinel
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2817.html
上一篇
03.Sentinel流控规则
下一篇
05.Sentinel热点key限流和系统规则
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
数据结构和算法
JavaSE
Java
Scala
Kibana
Python
MyBatis-Plus
链表
GET和POST
Azkaban
Tomcat
Quartz
Java阻塞队列
Ubuntu
DataWarehouse
MyBatisX
Elasticsearch
Java编程思想
JavaWEB项目搭建
机器学习
持有对象
Jquery
SpringBoot
字符串
RSA加解密
Eclipse
SQL练习题
前端
DataX
队列
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭