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

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


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

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

1. CircuitBreaker模块(熔断器)模块总体介绍

Resilience4j的CircuitBreaker主要由6个部分组成:管理熔断器实例的注册容器、熔断器的相关配置、熔断器的各种状态、触发熔断器状态变化的指标、熔断器行为变化产生的事件以及熔断器本身。

img

它们之间的基本调用关系如下图:

img

2. CircuitBreaker模块各部分详解

源码位置如下图:

img

2.1 CircuitBreakerRegistry(熔断器容器)

img

CircuitBreakerRegistry接口的实现类InMemoryCircuitBreakerRegistry在内部使用ConcurrentHashMap容器来存储CircuitBreaker实例,保证了并发安全及原子性。

通过CircuitBreakerRegistry可以创建新的CircuitBreaker实例及检索创建的CircuitBreaker实例。

需主要关注的源码如下:

public interface CircuitBreakerRegistry {

// 返回所有的CircuitBreaker实例
Seq<CircuitBreaker> getAllCircuitBreakers();

// 根据名称返回CircuitBreaker实例,
// 如果不存在则根据默认配置,创建CircuitBreaker实例并返回
CircuitBreaker circuitBreaker(String name);

// 根据名称返回CircuitBreaker实例,
// 如果不存在则 根据传入的配置实例,创建CircuitBreaker实例并返回
CircuitBreaker circuitBreaker(String name, CircuitBreakerConfig circuitBreakerConfig);

// 同上
CircuitBreaker circuitBreaker(String name, Supplier<CircuitBreakerConfig> circuitBreakerConfigSupplier);



// 根据自定义的配置,创建CircuitBreakerRegistry实例
// 线程安全的单例
static CircuitBreakerRegistry of(CircuitBreakerConfig circuitBreakerConfig){
return new InMemoryCircuitBreakerRegistry(circuitBreakerConfig);
}



// 使用默认配置,创建CircuitBreakerRegistry实例
// 线程安全的单例
static CircuitBreakerRegistry ofDefaults(){
return new InMemoryCircuitBreakerRegistry();
}

}

注意:在CircuitBreakerRegistry接口中使用static方法实现了线程安全的单例模式。

final class InMemoryCircuitBreakerRegistry implements CircuitBreakerRegistry {

private final CircuitBreakerConfig defaultCircuitBreakerConfig;

private final ConcurrentMap<String, CircuitBreaker> circuitBreakers;

public InMemoryCircuitBreakerRegistry() {
// 创建默认配置实例
this.defaultCircuitBreakerConfig = CircuitBreakerConfig.ofDefaults();

// 创建并发安全的容器放置CircuitBreaker实例
this.circuitBreakers = new ConcurrentHashMap<>();
}

......



// 调用CircuitBreaker.of(...)方法创建CircuitBreaker实例
@Override
public CircuitBreaker circuitBreaker(String name) {
return circuitBreakers.computeIfAbsent(Objects.requireNonNull(name, "Name must not be null"), (k) -> CircuitBreaker.of(name,
​ defaultCircuitBreakerConfig));
}

......

}

在InMemoryCircuitBreakerRegistry实现类中,主要做了2件事:创建了ConcurrentHashMap实例及调用CricuitBreaker.of(…)方法来创建CircuitBreaker实例。

下一篇文章《Resilience4j源码解析-2.2 CircuitBreaker模块》讲解熔断器配置部分。

文章目录
  1. 1. 1. CircuitBreaker模块(熔断器)模块总体介绍
  2. 2. 2. CircuitBreaker模块各部分详解
    1. 2.1. 2.1 CircuitBreakerRegistry(熔断器容器)