《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》

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


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

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

1. CircuitBreakerMetrics(熔断器度量指标)

上一篇文章我们分析了熔断器状态机的状态转换机制,这一篇文章我们分析一下熔断器度量指标,比如:包括触发状态转换的请求调用失败率是如何计算的。

相关联的类,如图:

img

1),CircuitBreaker.Metrics是一个度量指标接口,定义了一系列获取度量指标的方法,包括获取失败率的百分比、获取请求调用总数量,获取请求调用失败的数量、获取不允许请求调用通过的数量、获取设置的最大调用总数和获取请求调用成功的数量。

源码如图:

img

2,RingBitSet

在RingBitSet内部有一个按位存储的Ring Bit Bufffer(环形缓存区)数据结构BitSetMod,原理与java.util.BitSet一样,可以先去研究一下java.util.BitSet的机制。Ring Bit Buffer用于在熔断器关闭状态下,一次成功的调用在其bit位上存储0值,一次失败的调用在其bit位上存储1值。

img

计算请求失败率之前,Ring Bit Buffer的每一bit位都必须被存储过。例如,如果Ring Bit Buffer的大小设置为10,如果前9次的请求调用都失败也不会计算请求调用失败率。

3,CircuitBreakerMetrics类是CircuitBreaker.Metrics接口的实现类,内部持有RingBitSet类用来存储每次请求调用的结果,以便用于计算请求调用失败率,进而触发熔断器状态机的状态转换。

主要源码如下:

// 环形缓冲区大小
private final int ringBufferSize;

// Ring Bit Buffer
private final RingBitSet ringBitSet;

// 不允许请求调用通过的数量,采用并发更加高效的LongAdder类型
private final LongAdder numberOfNotPermittedCalls;

img

onError()和onSuccess()方法是由状态机的状态类中的onError(Throwable throwable)和onSuccess()方法调用的,用来检查是否达到了设定的请求调用失败率,进而调用状态机的状态转换方法。

以初始关闭状态转换到打开状态为例,如图:

img

状态机如何驱动状态转换的请看上一篇文章《Resilience4j源码解析-2.3.2 CircuitBreaker模块之有限状态机》。

下一篇文章《Resilience4j源码解析-2.5 CircuitBreaker模块之事件发布》讲解Resilience4j中的事件机制。

文章目录
  1. 1. 1. CircuitBreakerMetrics(熔断器度量指标)