Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机

3,CircuitBreakerState(熔断器状态)

从Resilience4j的logo就可以看出有限状态机的设计理念在Resilience4j项目中是多么重要。 图中的实心圆表示关闭状态,半心圆表示半开状态和空心圆表示打开状态。

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第1张图片

 

1),熔断器的有限状态机

CircuitBreaker的状态转换通过一个有限状态机来实现的,有3种常用状态: 关闭(CLOSED)、打开(OPEN)、半开(HALF_OPEN)和2种特定状态:不可用(DISABLED)、强制打开(FORCE_OPEN)。

 

状态转换关系如图:

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第2张图片

 

CLOSED ==> OPEN:单向转换。当请求失败率超过阈值时,熔断器的状态由关闭状态转换到打开状态。失败率的阈值默认50%,可以通过设置CircuitBreakerConfig实例的failureRateThreshold属性值进行改变。

 

OPEN <==> HALF_OPEN:双向转换。打开状态的持续时间结束,熔断器的状态由打开状态转换到半开状态。这时允许一定数量的请求通过,当这些请求的失败率超过阈值,熔断器的状态由半开状态转换回打开状态。半开时请求的数量是由CircuitBreakerConfig实例的ringBufferSizeInHalfOpenState属性值设置的。

 

HALF_OPEN ==> CLOSED:如果请求失败率小于阈值,则熔断器的状态由半开状态转换到关闭状态。

 

DISABLED和FORCE_OPEN这2种状态仅仅是表示退出上面3种状态时的临界状态标识,这2种状态不会被记录到统计指标中,也不会发送状态转换事件。关于统计指标和事件会在后面的文章中讲解。

 

配置属性值都有哪些以及其默认值,请看上一篇文章《Resilience4j源码解析-2.2 CircuitBreaker模块之配置》

 

2),状态的实现

下面我们看看Resilience4j是如何实现有限状态机的。将状态机的5种状态封装成5个对应的类,把这些状态的公共属性及公共行为抽象出来封装成抽象类CircuitBreakerState。如图:

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第3张图片

这些状态类都需要一个状态机属性CircuitBreakerStateMachine,用来驱动状态之间的转换。

 

CircuitBreakerState的公共属性:

// 有限状态机实例,内部实现了状态转换机制

CircuitBreakerStateMachine stateMachine;

 

CircuitBreakerState的公共方法:

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第4张图片

 

1,关闭状态源码:

// 关闭状态的度量指标

private final CircuitBreakerMetrics circuitBreakerMetrics;

// 请求调用的失败率阈值

private final float failureRateThreshold;

 

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第5张图片

 

2,打开状态源码:

// 打开状态的持续时间,在配置类CircuitBreakerConfig的实例中已设置

private final Instant retryAfterWaitDuration;

// 打开状态的度量指标

private final CircuitBreakerMetrics circuitBreakerMetrics;

 

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第6张图片

 

3,半开状态源码:

// 半开状态的度量指标

private CircuitBreakerMetrics circuitBreakerMetrics;

// 请求调用的失败率阈值,在配置类CircuitBreakerConfig的实例中已设置

private final float failureRateThreshold;

 

半开状态的逻辑与关闭状态的逻辑基本一样,只有checkFailureRate方法有变化

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第7张图片

 

至此,状态相关的类分析完了,下一篇文章我们看看有限状态机是如何驱动状态之间的转换。

 

下一篇文章《Resilience4j源码解析-2.3.2 CircuitBreaker模块之有限状态机》讲解熔断器的核心理念-有限状态机,及状态转换部分。

 

源码的中文注释地址:

https://github.com/Justin02180218/resilience4j


 ==大家可以关注我的微信公众号,后续文章将在公众号中同步更新==

Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机_第8张图片

你可能感兴趣的:(微服务)