扫码关注公众号:芋道源码

发送: 百事可乐
获取永久解锁本站全部文章的链接

《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 https://mp.weixin.qq.com/s/tujn4DelOuKbEX00-nWdQA 「coding到灯火阑珊」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. CircuitBreakerState(熔断器状态)

从Resilience4j的logo就可以看出有限状态机的设计理念在Resilience4j项目中是多么重要。

如图:

img

图中的实心圆表示关闭状态,半心圆表示半开状态和空心圆表示打开状态。

1.1 熔断器的有限状态机

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

状态转换关系如图:

img

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

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

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

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

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

1.2 状态的实现

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

img

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

CircuitBreakerState的公共属性:

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

CircuitBreakerStateMachine stateMachine;

CircuitBreakerState的公共方法:

img

1,关闭状态源码:

// 关闭状态的度量指标
private final CircuitBreakerMetrics circuitBreakerMetrics;

// 请求调用的失败率阈值
private final float failureRateThreshold;

img

2,打开状态源码:

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

private final Instant retryAfterWaitDuration;

// 打开状态的度量指标
private final CircuitBreakerMetrics circuitBreakerMetrics;

img

3,半开状态源码:

// 半开状态的度量指标
private CircuitBreakerMetrics circuitBreakerMetrics;

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

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

img

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

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

文章目录
  1. 1. 1. CircuitBreakerState(熔断器状态)
    1. 1.1. 1.1 熔断器的有限状态机
    2. 1.2. 1.2 状态的实现