一, Sentinel熔断降级
Sentinel除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
Sentinel的熔断降级和Hystrix对比, 请查看:https://blog.csdn.net/xiongxianze/article/details/87566963 Hystrix和Sentinel技术选型.
二, Sentinel以三种方式衡量被访问的资源是否处理稳定的状态
1 平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.
2 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
3 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
下面是响应超时的情况:
服务端:
public class NacosDataSourceInitFunc implements InitFunc {
@Override
public void init() throws Exception {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("com.itcast.sentinel.SentinelService");
//1s内处理5个请求
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
rule.setCount(10);//请求的平均响应时间(ms)
rule.setTimeWindow(5);//单位是s
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
}
//睡眠500ms
@Service
public class SentinelServiceImpl implements SentinelService {
@Override
public String sayHello(String name) throws InterruptedException {
Thread.sleep(500);
System.out.println("begin execute sayHello:"+name);
return "Hello World:"+name+"->timer:"+ LocalDateTime.now();
}
}
参考:https://blog.csdn.net/xiongxianze/article/details/87572916