上篇文章讲了流控规则,而除了流控规则之后还有降级、热点、系统、授权等规则,这篇文件主要讲降级规则。
降级规则主要处理节点是DegradeSlot,其中具体逻辑由DegradeRuleManager.checkDegrade
实现
public static void checkDegrade(ResourceWrapper resource, Context context, DefaultNode node, int count)
throws BlockException {
if (degradeRules == null) {
return;
}
List<DegradeRule> rules = degradeRules.get(resource.getName());
if (rules == null) {
return;
}
for (DegradeRule rule : rules) {
if (!rule.passCheck(context, node, count)) {
throw new DegradeException(rule.getLimitApp(), rule);
}
}
}
获取所有的降级规则,进行一个个的校验,校验逻辑是由DegradeRule
实现,这里和流控规则FlowRule类似,先看下内部属性
public class DegradeRule extends AbstractRule {
//
private static final int RT_MAX_EXCEED_N = 5;
private double count;
private int timeWindow;
private int grade = RuleConstant.DEGRADE_GRADE_RT;
private volatile boolean cut = false;
private AtomicLong passCount = new AtomicLong(0);
- RT_MAX_EXCEED_N:在降级策略为RT的情况下,如果连续RT_MAX_EXCEED_N个请求都大于配置的值,那么会在窗口时间内会进行降级状态,所有流量都会返回false(抛出 DegradeException);在降级策略为异常比例的情况下,总qps且异常数大于该值才会进行异常比例的判断
- count:降级策略为RT则表示响应时间;降级策略为异常比例则表示异常比例;降级策略为异常数则表示异常数量
- timeWindow:降级的时间窗口,在该窗口时间内请求都不能通过
- grade:降级熔断策略
- cut:是否被降级熔断,如果true,则请求过来直接拒绝
- passCount:降级策略为RT的时候用来统计超过配置值的数量
接下来看下DegradeRule
的处理
@Override
public boolean passCheck(Context context, DefaultNode node, int acquireCount, Object... args) {
//是否降级
if (cut) {
return false;