核心接口CircuitBreaker,提供了核心方法的声明,如下
1.enable : 判断该熔断器是否是可用的
2.getStatus:获取熔断器状态
3.allowRequest: 判断是否允许请求执行
4.setSuccess: 标记执行成功的request
5.setFailed : 标记失败的request
6.complete:熔断执行完毕
7.setCircuitBreakerListener: 设置熔断监听器
8.isFallbackOnException : 判断是否为抛出异常就调用降级函数
9.handleDegrade : 执行降级逻辑
10.getCircuitBreakerProperties: 获取熔断器属性
getInstance 获取熔断器实例
1.首先根据rhinoKey,从本地缓存circuitBreakers中获取出circuitBreaker
2.如果没有获取到,就根据rhinoKey和熔断器的配置初始化一个熔断器,然后放到本地内存中
再看一下熔断的事件类型,如下图:
查看核心类DefaultCircuitBreaker的实现
实现方法是doAllowRequest
1.先判断熔断器上下文是否为null,如果是,则新建一个熔断器上下文,放到本地ThreadLocal中
2.上下文设置请求状态(未开启,半开启,开启)
3.如果请求状态是降级,就关闭熔断器相关设置
4.检查信号量,如果是正常请求或试探请求,且参数timeout大于0,则需要进行超时检查。
开启超时监听(如果执行了tick方法,并且setRequestTimeout()返回了true,代表主线程超时) ,就中断主线程,抛出timeoutException。
下发请求超时的事件event
5.如果请求被信号量拒绝,也下发对应的请求拒绝事件
判断熔断器的状态
1.如果熔断器没有开启,那么认为请求的状态是正常的
2.如果熔断器是半开启状态,则代表试探成功,那么就开始恢复正常请求
2.1 先从恢复策略中获取百分比percent,大于100,则自动把熔断器关闭掉
2.2 百分比不大于100,就按照百分比,随机地让当前线程进行降级或者恢复正常
3.如果熔断器是开启状态,那么就先判断是否要进行试探。和上一次试探时间比对,看是否大于时间阈值
1.先判断熔断器上下文不为空,并且是可用的
2.判断当前请求状态,如果是降级的,就直接return
3.熔断器上下文清除掉超时监听器
4.把请求设置为完成,熔断器上下文标记为success;如果是试探请求,就需要重置统计数据,如果不是试探请求,就标记为成功,下发对应的请求成功的事件
1.先判断熔断器上下文不能为空,并且是可用的,标记为fail
2.判断请求状态如果是降级的,就直接return
3.熔断器上下文,清除掉超时监听器
4.判断当前请求如果是试探的请求类型,就return
5.获取当前的健康检查统计数据,如果接口失败率过高,就触发熔断(和配置比对,判断是否触发熔断);如果当前是半open状态,就需要试探
1.如果请求状态不是降级的,就释放信号量
2.清除熔断器上下文的参数