sentinel源码分析第十三篇一核心流程一DegradeSlot熔断

源码分析一DegradeSlot.entry

  • 熔断检查
  • 获取熔断器规则
  • 未通过熔断检测则报错

public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count,
                      boolean prioritized, Object... args) throws Throwable {
    熔断检查
    performChecking(context, resourceWrapper);

    fireEntry(context, resourceWrapper, node, count, prioritized, args);
}

 void performChecking(Context context, ResourceWrapper r) throws BlockException {
    获取熔断器规则
    List<CircuitBreaker> circuitBreakers = DegradeRuleManager.getCircuitBreakers(r.getName());
    if (circuitBreakers == null || circuitBreakers.isEmpty()) {
        return;
    }
    for (CircuitBreaker cb : circuitBreakers) {
        未通过熔断检测则报错
        if (!cb.tryPass(context)) {
            throw new DegradeException(cb.getRule().getLimitApp(), cb.getRule());
        }
    }
}

源码分析一熔断器开关以及半开状态分析

  • 如果熔断器打开则进行降级,但设置一个时间戳,用于半开检测
  • 当前时间戳超过半开检测时间戳,则设置为半开状态
  • 如果设置半开状态成功则通过熔断器检测
 public boolean tryPass(Context context) {
    // Template implementation.
    熔断器关闭则可以通过
    if (currentState.get() == State.CLOSED) {
        return true;
    }

    if (currentState.get() == State.OPEN) {
        // For half-open state we allow a request for probing.
        下个时间点到了 则允许请求通过
        return retryTimeoutArrived() && fromOpenToHalfOpen(context);
    }
    return false;
}

总结

  • 熔断器ExceptionCircuitBreaker负责异常数和异常比例熔断
  • 熔断器ResponseTimeCircuitBreaker负责慢请求比例熔断

扩展点一降级熔断配置图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值