1. 概述
DegradeSlot
是用于服务降级熔断:
-
在执行
entry
的过程中,对于处于熔断open
状态的情况则判断是否已经过了熔断期且设置半开成功,那么就通过.否则不通过报DegradeException
-
对于处于降级状态即
half-open
的时候,则直接抛出DegradeException
.
2. 熔断器
Sentinel的熔断器一共有两种ExceptionCircuitBreaker
和 ResponseTimeCircuitBreaker
都 extends AbstractCircuitBreaker implements CircuitBreaker
。
在上一个之前slot执行过程中,如果发生了非BlockException即一些未知的throw,那么在exit内会判断error是否达到配置的erro数量或者错误比例。
如果整个调用过程超过了配置的超时时间 则也会触发熔断。
熔断的目的是将熔断器的状态设置到半开或者全开,这样在tryPass校验的时候就可以返回通过或者异常了。
配置面板如下:
根据配置项,可以具体看一下熔断器的接口 CircuitBreaker:
public interface CircuitBreaker {
/**
* 降级熔断规则
*/
DegradeRule getRule();
/**
* true 判断需要降级
*/
boolean tryPass(Context context);
/**
* 当前熔断器的状态
*/
State currentState();
/**
* 回调方法 当请求pass通过后触发
*/
void onRequestComplete(Context context);
/**
* Circuit breaker state.
*/
enum State {
OPEN,
HALF_OPEN,
CLOSED
}
}
复制代码
了解了熔断规则以后,下面将具体阐述熔断流程。
3. 熔断机制的处理流程
达到熔断触发条件(假设触发条件为当接口每秒钟超过20%的处理产生异常,具体熔断规则由用户配置),便会开启熔断,在熔断状态下,X秒内所有该接口访问都会被Blocked快速失败(服务降级)
X秒后,下一次请求接口,此时为半开状态:
- 如果请求接口成功,恢复到正常状态
- 如果请求接口失败,回到熔断状态继续Blocked X秒
4. 熔断器状态
先看一下这整个熔断器的状态转化图,其中open到half-open的状态只发生在熔断器检验过程:
5. 源码解析
Sentinel的熔断是由责任链中的最后一个DegradeSlot
来实现的
@SpiOrder(-1000)
public class DegradeSlot extends AbstractLinkedProcessorSlot<DefaultNode> {
@Override
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count,
boolean prioritized, Object... args) throws Throwable {
//在触发后续slot前执行熔断的检查
performChecking(context, resourceWrapper);
fireEntry(context, resourceWrapper, node, count, prioritized, args);
}
void performChecking(Context context, ResourceWrapper r) throws BlockException {
//通过资源名称获取所有的熔断CircuitBreaker
List<CircuitBreaker> circuitBreakers = DegradeRuleMan