03、Resilience4j 源码解析 CircuitBreaker、State、StateTransition、EventPublisher、Metrics

CircuitBreaker

CircuitBreaker主要分为以下几个模块:熔断器配置,熔断器注册,熔断事件消费者注册,熔断器状态机,熔断器状态及指标,熔断器事件,熔断器事件处理器,熔断器事件消费者。

 

各模块间关系

 

  • CircuitBreakerRegistry通过其实现类InMemoryCircuitBreakerRegistry根据CircuitBreakerConfig创建CircuitBreaker实例。
  • EventConsumerRegistry通过其实现类DefaultEventConsumerRegistry创建EventConsumer事件消费者。
  • CircuitBreaker通过其实现类CircuitBreakerStateMachine处理熔断状态,并发布CircuitBreakerEvent从而被注册到EventProcessor事件处理器的EventConsumer事件消费者消费。

State

熔断状态,其数字表示序号,boolean类型表示是否允许发布CircuitBreakerEvent

/** 熔断器不工作,没有状态变化、事件,允许所有请求通过.*/
DISABLED(3, false),
/** 熔断器工作,但不熔断,允许所有请求通过.*/
CLOSED(0, true),
/** 熔断器工作,开启熔断,不允许所有请求通过.*/
OPEN(1, true),
/*强制开启熔断,没有状态变化、事件,不允许任意请求通过. */
FORCED_OPEN(4, false),
/** 熔断器开启之后,超过等待周期,进入半开,运行部分请求通过*/
HALF_OPEN(2, true);

StateTransition

熔断器状态转换的所有情况枚举

CLOSED_TO_OPEN(State.CLOSED, State.OPEN),
CLOSED_TO_DISABLED(State.CLOSED, State.DISABLED),
CLOSED_TO_FORCED_OPEN(State.CLOSED, State.FORCED_OPEN),
HALF_OPEN_TO_CLOSED(State.HALF_OPEN, State.CLOSED),
HALF_OPEN_TO_OPEN(State.HALF_OPEN, State.OPEN),
HALF_OPEN_TO_DISABLED(State.HALF_OPEN, State.DISABLED),
HALF_OPEN_TO_FORCED_OPEN(State.HALF_OPEN, State.FORCED_OPEN),
OPEN_TO_CLOSED(State.OPEN, State.CLOSED),
OPEN_TO_HALF_OPEN(State.OPEN, State.HALF_OPEN),
OPEN_TO_DISABLED(State.OPEN, State.DISABLED),
OPEN_TO_FORCED_OPEN(State.OPEN, State.FORCED_OPEN),
FORCED_OPEN_TO_CLOSED(State.FORCED_OPEN, State.CLOSED),
FORCED_OPEN_TO_OPEN(State.FORCED_OPEN, State.OPEN),
FORCED_OPEN_TO_DISABLED(State.FORCED_OPEN, State.DISABLED),
FORCED_OPEN_TO_HALF_OPEN(State.FORCED_OPEN, State.HALF_OPEN),
DISABLED_TO_CLOSED(State.DISABLED, State.CLOSED),
DISABLED_TO_OPEN(State.DISABLED, State.OPEN),
DISABLED_TO_FORCED_OPEN(State.DISABLED, State.FORCED_OPEN),
DISABLED_TO_HALF_OPEN(State.DISABLED, State.HALF_OPEN);

CircuitBreaker.EventPublisher

通过CircuitBreaker.EventPublisher可以注册事件消费策略,且可根据不同事件类型注册不同的处理策略,onEvent默认所有事件触发。

//请求成功时触发的事件消费策略
EventPublisher onSuccess(EventConsumer<CircuitBreakerOnSuccessEvent> eventConsumer);
//请求失败时触发的事件消费策略
EventPublisher onError(EventConsumer<CircuitBreakerOnErrorEvent> eventConsumer);
//熔断状态发生变化时触发的事件消费策略
EventPublisher onStateTransition(EventConsumer<CircuitBreakerOnStateTransitionEvent> eventConsumer);
//熔断状态被重置触发的事件消费策略
EventPublisher onReset(EventConsumer<CircuitBreakerOnResetEvent> eventConsumer);
//请求出现异常,但是是可忽略的异常时触发的事件消费策略
EventPublisher onIgnoredError(EventConsumer<CircuitBreakerOnIgnoredErrorEvent> eventConsumer);
//熔断开启请求不运行通过的事件消费策略
EventPublisher onCallNotPermitted(EventConsumer<CircuitBreakerOnCallNotPermittedEvent> eventConsumer);

Metrics

熔断器监控指标

/**
 * 失败请求比率,当失败次数未达到压力值,返回-1
 */
float getFailureRate();

/**
 * 当前所有请求总数
 */
int getNumberOfBufferedCalls();

/**
 * 当前所有失败请求总数
 */
int getNumberOfFailedCalls();

/**
 * 当熔断器状态处于OPEN时,返回被禁止调用的请求总数,当处于CLOSED or HALF_OPEN时,返回0
 */
long getNumberOfNotPermittedCalls();

/**
 * 返回环形缓存区最大请求总数
 */
int getMaxNumberOfBufferedCalls();

/**
 * 返回当前成功请求总数
int getNumberOfSuccessfulCalls();

从下面截图可以看出熔断器核心接口CircuitBreaker提供的核心功能可分为以下几类:

  • 请求鉴权
  • 熔断处理
  • 状态转换
  • 装饰多种请求
  • 返回熔断信息(如状态、监控指标、配置等)