Hystrix超时熔断机制源码分析

前言

我们知道使用Feign的时候可以配置Hystrix的超时熔断机制,配置起来其实很简单,简单理解这个Hystrix超时熔断其实就是我们可以给Feign远程调用设置一个超时时间,远程调用超过这个时间后,就会被Hystrix熔断,然后执行我们定义好的熔断回调方法!当然这个设置Feign超时时间并不是真的设置Feign的远程调用超时时间,而是设置Hystrix熔断时间,这个Hystrix的限制是大于Feign的!

假设我们配置了Feign的超时时间为20秒(这里不管设置的是Feign的ReadTimeout还是Ribbon的ReadTimeout)我们先理解为Feign的超时,关于Feign和Ribbon的ReadTimeout区别后期有空再分享!然后我们Feign配置了开启Hystrix,并且设置Hystrix超时为10秒,那么10秒后就会被Hystrix超时捕获,并且熔断回调我们定义的Fallback方法!

代码环境

Provider
在这里插入图片描述

Provider-Feign
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

consumer
在这里插入图片描述
consumer-config

feign:
  hystrix:
    enabled: true
  client:
    config:
      #将调用的微服务名称改成default就配置成全局的了
      default:
        connectTimeout: 2000
        readTimeout: 20000
        loggerLevel: BASIC
    default-to-properties: true #默认是否properties配置文件配置优先


  
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000

请求情况
Provider服务处理耗时20秒,Feign设置readTimeout为20秒,理论上是可以收到请求的,但是我们配置了Hystrix超时熔断,且熔断时间为10秒。所以Hystrix在请求发出前开始计时,等待10秒,发现还没有收到Provider返回,那么就会熔断进入Fallback方法,如下!
在这里插入图片描述
最终响应
在这里插入图片描述

源码分析

本文只分析Hystrix超时熔断这部分代码,其他后期有空再分享!

入口代码
在这里插入图片描述
在AbstractCommand类中的executeCommandAndObserve方法中,关于这个方法其他部分,本文不分析!核心也就是两块逻辑
executeCommandWithSpecifiedIsolation和.lift(new HystrixObservableTimeoutOperator(_cmd))

executeCommandWithSpecifiedIsolation:这个方法中是使用RxJava实现的,Observable.defer通过.subscribeOn(threadPool.getScheduler(new Func0()这行代码实现异步发送数据!关于这部分看下文
Hystrix线程池创建,调用

.lift是RxJava的一个语法大致意思就是便更执行顺序,先执行.lift(new HystrixObservableTimeoutOperator(_cmd))在执行executeCommandWithSpecifiedIsolation方法!这个自己去找RxJava的语法看看!那么关于超时熔断的核心代码就再new HystrixObservableTimeoutOperator(_cmd)这部分逻辑了,注意这里是先执行new HystrixObservableTimeoutOperator(_cmd))在执行executeCommandWithSpecifiedIsolation哦!

创建超时监听器
在这里插入图片描述
注意这部分断点的打法!
在这里插入图片描述
这里Hystrix超时监听器不是和Http请求在同一个线程,也不是和Feign远程调用在一个线程,Hystrix超时监听器是独立的一个线程!(Feign中的线程是在线程池中获取的,Hystrix超时监听器是通过ScheduledExecutor实现的!)

启动超时监听器
在这里插入图片描述
在这里插入图片描述
这里基于ScheduledExecutor实现的超时监听器的时间就是我们配置Hystrix的超时时间10秒!也就是10秒后调度到Runnable的run方法,注意这里run方法是个独立的线程,所以run方法中的断点也是需要特殊标记才能卡住!
在这里插入图片描述
这里ScheduledFuture执行run的线程名如下!
在这里插入图片描述
在此设置!
在这里插入图片描述
那么当10秒时间到了后HystrixTimer-xx线程执行到run方法中,然后调用listener.tick();方法!进入超时检查,如果超时了!那么进入熔断逻辑!
在这里插入图片描述熔断逻辑中的Fallback方法调用都是交给HystrixTimer-xx线程处理的,并不是Http请求线程或者是Feign调度线程!
在这里插入图片描述
那么至此,Hystrix超时熔断机制源码分析就完成了!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员劝退师-TAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值