0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​源码分析一DegradeSlot.entry​​
  • ​​源码分析一熔断器开关以及半开状态分析​​
  • ​​总结​​
  • ​​扩展点一降级熔断配置图​​

源码分析一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负责慢请求比例熔断

扩展点一降级熔断配置图

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


举报

相关推荐

0 条评论