服务保障组件 熔断实现01

核心接口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.清除熔断器上下文的参数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值