Sentinel 降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗⼝之内,对该资源的调⽤都自动动熔断
RT(平均响应时间 )
当 1s 内持续进⼊ >=5 个请求,平均响应时间超过阈值(以 ms 为单位),那么在接下的时间窗口
(以 s 为单位)之内,对这个方法的调用都会子动地熔断(抛出 DegradeException)。注意
Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限
可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx
来配置。
- 测试
异常比例
当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状
态,即在接下的时间窗⼝(以 s 为单位)之内,对这个方法的调⽤都会自动地返回。异常比率的阈
值范围是 [0.0, 1.0] ,代表 0% - 100%。
- 测试
异常数
当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若
timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
时间窗口 >= 60s
Sentinel 自定义兜底逻辑
- 代码
@SentinelResource
注解类似于Hystrix中的@HystrixCommand
注解
@SentinelResource
注解中有两个属性需要我们进⾏区分,blockHandler属性来指定不满足Sentinel
规则的降级兜底⽅法,fallback属性用于于指定Java运行时异常兜底方法
// Sentinel的降级策略
blockHandlerClass = AutodeliverHandlersClass.class,blockHandler = "handlerException"
//java 代码异常的降级策略
fallbackClass = AutodeliverHandlersClass.class,fallback = "handlerError"
@GetMapping("/checkState/{userId}")
@SentinelResource(value = "findResumeOpenState",blockHandlerClass = AutodeliverHandlersClass.class,blockHandler = "handlerException",fallbackClass = AutodeliverHandlersClass.class,fallback = "handlerError")
public Integer findResumeOpenState(@PathVariable Long userId) {
//模拟RT
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// 模拟降级:异常比列
// int i =1/0;
Integer defaultResumeState = resumeFeignClient.findDefaultResumeState(userId);
System.out.println("======>>>调⽤微服务,获取到⽤户" + userId + "的默认 简历当前状态为:" + defaultResumeState);
return defaultResumeState;
}
package com.w.edu.config;
import com.alibaba.csp.sentinel.slots.block.BlockException;
/**
* @author Mrwg
* @date 2023/5/22 21:16
* @description
*/
public class AutodeliverHandlersClass {
public static Integer handlerException(Long userId, BlockException blockException) {
return -100;
}
public static Integer handlerError(Long userId) {
return -500;
}
}
- 流控规则