有限状态机的实现
状态建模完成,还需要建模一个状态机来驱动状态的变化,把状态机封装成类CircuitBreakerStateMachine。如图:
CircuitBreakerStateMachine类实现了熔断器CircuitBreaker接口,除了实现状态转换机制,还实现了熔断机制和事件发布机制。
所以CircuitBreakerStateMachine类是整个熔断器模块的核心类,在这篇文章中我们只研究状态转换机制,在后续的文章中我们逐步讲解熔断机制和事件发布机制。
下面我们看一下CircuitBreaker接口和CircuitBreakerStateMachine实现类中与状态相关的属性和方法:
1,在CircuitBreaker接口中声明了状态的枚举类,主要是为了方便进行判等操作,同时也设置了每种状态是否允许发布事件
2,CircuitBreakerStateMachine实现类中,用AtomicReference保证对CircuitBreakerState引用的原子性,在构造方法中初始化状态机为关闭状态。
//用AtomicReference保证对CircuitBreakerState引用的原子性
private final AtomicReference
构造方法:
状态转换系列方法:
/**
* 转换到不可用状态
*/
@Override
public void transitionToDisabledState() {
stateTransition(DISABLED, currentState -> new DisabledState(this));
}
/**
* 转换到强制打开状态
*/
@Override
public void transitionToForcedOpenState() {
stateTransition(FORCED_OPEN, currentState -> new ForcedOpenState(this));
}
/**
* 转换到关闭状态
*/
@Override
public void transitionToClosedState() {
stateTransition(CLOSED, currentState -> new ClosedState(this, currentState.getMetrics()));
}
/**
* 转换到打开状态
*/
@Override
public void transitionToOpenState() {
stateTransition(OPEN, currentState -> new OpenState(this, currentState.getMetrics()));
}
/**
* 转换到半开状态
*/
@Override
public void transitionToHalfOpenState() {
stateTransition(HALF_OPEN, currentState -> new HalfOpenState(this));
}
这些状态转换方法是由各状态类实例来调用的,具体可以参考上一篇文章《Resilience4j源码解析-2.3.1 CircuitBreaker模块之有限状态机》
下一篇文章《Resilience4j源码解析-2.4 CircuitBreaker模块之度量指标》讲解熔断器触发状态转换的度量指标。
源码的中文注释地址: