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)即可。
@Configurationpublic class FeignConfiguration { @Autowired private ObjectFactorymessageConverters; @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@LoadBalancedpublic RestTemplate restTemplate() { SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); simpleClientHttpRequestFactory.setConnectTimeout(1000); simpleClientHttpRequestFactory.setReadTimeout(30000); return new RestTemplate(simpleClientHttpRequestFactory);}
- ribbon配置示例:
ribbon.eureka.enabled = trueribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRuleribbon.MaxAutoRetries=1ribbon.MaxAutoRetriesNextServer=2ribbon.ConnectTimeout=3000ribbon.ReadTimeout=100000
根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),如果不行,就换一个实例进行访问,如果还是不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),如果依然不行,返回失败信息。如果在此期间达到hystrix的超时时间,则返回fallback内容。