springcloud中有很多超时时间配置,总结一下各处超时时间的使用及配置。
-
zuul超时
zuul超时分两种情况,使用service discovery,需要配置ribbon.ReadTimeout 和 ribbon.SocketTimeout
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 100000 #命令执行超时时间,默认1000ms,应大于ribbon超时时间
ribbon:
ReadTimeout: 60000
ConnectTimeout: 3000
此种情况下,Zuul转发所使用的过滤器是org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter ,在这个过滤器中,整合了Hystrix以及Ribbon。
不使用service discovery,直接使用url(不常用),使用zuul.host.connect-timeout-millis 和 zuul.host.socket-timeout-millis
zuul:
routes:
user-route: # 该配置方式中,user-route只是给路由一个名称,可以任意起名。
url: http://192.168.0.11:8000/ # 指定的url
path: /user/** # url对应的路径
处。
zuul:
host:
socket-timeout-millis: 10000
connect-timeout-millis: 2000
- ribbon超时
全局设置
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000
根据service-id进行设置,不同service-id设置不同的参数
service-id:xcloud-dataservice
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000
- hystrix超时
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 1000
- feign超时
从Spring Cloud Edgware开始,Feign支持使用属性配置超时,默认connectTimeout:10000,readTimeout: 60000:
feign:
client:
config:
feignName:
connectTimeout: 10000
readTimeout: 60000
老版本,可以重写feign.Request.Options ,参考:org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration#feignRequestOptions 的写法即可。
如下,启动类加上注解@Import(FeignConfiguration.class)即可。
@Configuration
public class FeignConfiguration {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Retryer retryer(){
return new Retryer.Default(1000,10000,3);
}
@Bean
Request.Options feignOptions() {
return new Request.Options(5 * 1000, 30 * 1000);
}
@Bean
@Primary
@Scope("prototype")
public Encoder multipartFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Bean
public ErrorDecoder errorDecoder(){
return new FeignErrorDecoder();
}
}
- RestTemplate超时
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setConnectTimeout(1000);
simpleClientHttpRequestFactory.setReadTimeout(30000);
return new RestTemplate(simpleClientHttpRequestFactory);
}
- ribbon配置示例:
ribbon.eureka.enabled = true
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
ribbon.MaxAutoRetries=1
ribbon.MaxAutoRetriesNextServer=2
ribbon.ConnectTimeout=3000
ribbon.ReadTimeout=100000
根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),如果不行,就换一个实例进行访问,如果还是不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),如果依然不行,返回失败信息。如果在此期间达到hystrix的超时时间,则返回fallback内容。