【问题排查】开启 SpringFeign 的 Hystrix 熔断器出现 timed-out and no fallback available 错误

本贴最后更新于 1905 天前,其中的信息可能已经物是人非

timed-out and no fallback available

作者:猫巳
博客:望舒阁

错误描述

今天在 SpringFeign 中集成 Hystrix 熔断处理后,当请求大于 1 秒左右就会进行熔断处理,跳转到熔断处理的结果。

//@FeignClient(value = "moonce-user-provider",configuration = FeignConfig.class,fallback = UserHystrix.class)
//去掉熔断处理,改为:
@FeignClient(value = "moonce-user-provider")

我把熔断处理去掉后,出现超时错误,而服务提供商会继续运行,返回结果如下:

{
    "timestamp": "2018-12-20T01:31:17.281+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "XXXXX(String,String) timed-out and no fallback available.",
    "path": "/register"
}

错误原因

Hystrix 熔断器默认超时时间是 1 秒钟,我们需要在配置中修改它的超时时间配置,同时也要设置 ribbon 的超时时间。

1.设置超时时间,加大超时时间,推荐使用。

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000  #熔断超时时间
ribbon:
  ReadTimeout: 60000  #请求处理的超时时间
  ConnectTimeout: 60000 #请求连接超时时间
  MaxAutoRetries: 0 #对当前实例的重试次数
  MaxAutoRetriesNextServer: 1 #切换实例的重试次数 1

2.关闭超时时间报错,将不会进行超时时间操作。

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true #是否启用超时时间
ribbon:
  ReadTimeout: 60000  #请求处理的超时时间
  ConnectTimeout: 60000 #请求连接超时时间
  MaxAutoRetries: 0 #对当前实例的重试次数
  MaxAutoRetriesNextServer: 1 #切换实例的重试次数 1

3.关闭 Hystrix 服务(如果不需要熔断处理的话)。

feign:
  hystrix:
    enabled: false

中间曲折

imagepng

1.以为应该修改 FeignConfig 文件时间

错误修改 FeignConfig 这里的配置,网上说第一参数为 period,意思为每次执行间隔 0.1 秒,第二个参数 maxPeriod 为请求最大时间,第三个参数为 maxAttempts 最大尝试次数,2 的时候为失败后尝试一次

@Configuration
public class FeignConfig {
  @Bean
  public Retryer feignRetryer(){
    return new Retryer.Default(100L, TimeUnit.SECONDS.toMillis(1L),5);
  }
}

2.只配置 Ribbon 或者只配置了 hystrix 的超时时间

这两个必须一起用,原因可以看上面的原理图,如果只配了 hystrix 的超时时间,那么在连接的时候依然还是会被 Ribbon 超时中断掉,这个还遇到一个坑,就是 Ribbon 的会替换掉 feignClent 的配置,因为用了 feign 肯定会用到 ribbon,所以 feign 的重试机制相对来说比较鸡肋,自己的项目关闭了该功能。而 ribbon 的重试机制默认也配置为 0,去除重试机制,如果配置不当,会因为幂等请求带来数据问题。所以建议关闭二者的重试功能。所以只需要在配置文件中配置 Ribbon 就可以了,不需要再写 FeignConfig 配置类。

  • Hystrix
    7 引用
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3165 引用 • 8206 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...