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
中间曲折
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 配置类。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于