3.降级策略:异常数(ERROR_COUNT)
服务降级
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(比如:调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败返回,避免影响到其他资源而导致级联错误。
当资源被降级后,在接下来的时间窗口之内,对资源的调用都自动熔断。
1.降级策略:慢调用比例(SLOW_REQUEST_RATIO)
慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该RT值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数大于设置的最小请求数,并且慢调用的比例大于设置的比例阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用RT值则结束熔断,若大于设置的慢调用RT值则会再次会被熔断。
1.编写controller类
@GetMapping("/getBody6_1")
public String getBody6_1(){
try {
TimeUnit.SECONDS.sleep(1);//睡眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
return "getBody6_1";
}
2.新增熔断规则:
说明:在1000毫秒内,当请求数大于5,接口响应时间大于800ms,慢调用比例达到100%时,接下来的20秒内自动开启熔断。
补充:整合nacos后,下发配置对应的内容如下:
[
{
"resource": "/getBody6_1",//资源名
"grade": 0,//熔断策略,0-慢调用比例
"count": 800,//最大RT
"slowRatioThreshold": 1,//比例阈值
"timeWindow": 20,//熔断时长
"minRequestAmount": 5,//最小请求数
"statIntervalMs": 1000//统计时长
}
]
3.使用JMeter压测工具,让1秒内请求接口(http://localhost:9001/getBody6_1)10次,这时Sentinel就开启了熔断。
4.使用浏览器请求:http://localhost:9001/getBody6_1
2.降级策略:异常比例(ERROR_RATIO)
异常比例:当单位统计时长(statIntervalMs)内请求数大于设置的最小请求数,并且异常比例大于设置的比例阈值,则接下来的熔断时长内请求自动会被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功(无异常)则结束熔断,否则会再次被熔断。
1.编写controller类
@GetMapping("/getBody6_2")
public String getBody6_2(Integer id){
if(id != null && id < 0){
throw new RuntimeException("运行异常");
}
return "getBody6_2";
}
2.新增熔断规则:
说明:在1000毫秒内,当请求数大于5且异常比例达到阈值50%时,接下来的20秒内自动开启熔断。
补充:整合nacos后,下发配置对应的内容如下:
[
{
"resource": "/getBody6_2",//资源名
"grade": 1,//熔断策略:1-异常比例
"count": 0.5,//比例阈值
"timeWindow": 20,//熔断时长
"minRequestAmount": 5,//最小请求数
"statIntervalMs": 1000//统计时长
}
]
3.使用浏览器请求:http://localhost:9001/getBody6_2?id=-1
3.降级策略:异常数(ERROR_COUNT)
当单位统计时长(statIntervalMs)内请求数大于设置的最小请求数,并且异常数大于设置的异常数,则接下来的熔断时长内请求自动会被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功(无异常)则结束熔断,否则会再次被熔断。
1.仍然使用上面的controller类
2.新增熔断规则:
说明:在1000毫秒内,当请求数大于5且异常数达到5时,接下来的20秒内自动开启熔断。
补充:整合nacos后,下发配置对应的内容如下:
[
{
"resource": "/getBody6_2",//资源名
"grade": 2,//熔断策略:2-异常数
"count": 5,//异常数
"timeWindow": 20,//熔断时长
"minRequestAmount": 5,//最小请求数
"statIntervalMs": 1000//统计时长
}
]
3.使用浏览器请求:http://localhost:9001/getBody6_2?id=-4,快速刷新页面,就会出现熔断。
4.当20秒后,如果使用浏览器请求:http://localhost:9001/getBody6_2?id=0,接口访问正常,说明熔断结束。如果使用浏览器请求:http://localhost:9001/getBody6_2?id=-4,接口访问异常,再次访问熔断自动开始。