Feign客户端消费服务超时:com.netflix.hystrix.exception.HystrixRuntimeException:timed-out and fallback failed.

一. 背景

在微服务项目中,我的服务消费使用的是Feign客户端,在调用服务提供者提供的接口时,报超时异常了,异常如下:

com.netflix.hystrix.exception.HystrixRuntimeException: RemoteCardImgHandleFeign#getVehicleLicenseInfos(CardInfosVi) timed-out and fallback failed.

在这里插入图片描述

二. Feign设置超时时间

1.使用Feign调用接口分两层,ribbon的调用和hystrix的调用,所以ribbon的超时时间和Hystrix的超时时间的结合就是Feign的超时时间
2. 一般情况下 都是 ribbon的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制),如果ribbon 的超时时间大于hystrix的超时时间,对于ribbon的重试是没有意义的(hystrix超时熔断了,ribbon无法重试)
在这里插入图片描述

三. 原因

Hystrix组件缺省超时判断默认为1秒钟,超过1秒就会报超时异常日志,由于我的服务器是在Linux环境,网络延迟非常大,虽然已经把超时设置成了5秒,但是还是短了,可以将超时再设置长一点。

四. 解决方式

hystrix的默认超时1秒直接改成10秒,由于我的测试环境网络延迟很慢,5秒还是不够,直接设置成10秒

  • application.yml
##feign中使用断路器Hystrix,默认是没有开启的,需要开启
feign:
  hystrix:
    enabled: true
#hystrix的超时时间    
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            #设置请求超时时间,默认1秒,超过指定的时间后,触发服务熔断
            timeoutInMilliseconds: 10000
#ribbon的超时时间
ribbon:
  ReadTimeout: 5000 #设置请求处理的超时时间
  ConnectTimeout: 5000  #设置请求链接的超时时间                     

五. 另外两种解决方式(未测试过,仅供参考)

下面两种方式是比较暴力的一种解决方式,但在实际项目中并不推荐,对服务高可用存在一定的影响,两种我没有测试,还是推荐使用上面第一种

  • 第一种: 禁用Hystrix的请求时间超时限制
#hystrix的超时时间    
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false
  • 第二种: 禁用feignhystrix
feign:
  hystrix:
    enabled: false
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章