一. 背景
在微服务项目中,我的服务消费使用的是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 #设置请求链接的超时时间
五、在Feign中禁用Hystrix
- 第一种:禁用
Hystrix
:
要基于每个客户端禁用Hystrix
支持,请创建Feign.Builde
r具有“原型”范围的香草,这段话摘自官网,例如:
import feign.Feign;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class FooConfiguration {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder();
}
}
下面两种方式是比较暴力的一种解决方式,但在实际项目中并不推荐,对服务高可用存在一定的影响,两种我没有测试,还是推荐使用上面第一种
- 第二种: 禁用Hystrix的请求时间超时限制
#hystrix的超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: false
- 第三种: 禁用
feign
的hystrix
feign:
hystrix:
enabled: false