文章目录
- 源码分析一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负责慢请求比例熔断
扩展点一降级熔断配置图