springcloud超时机制

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内容。

原文地址:https://www.cnblogs.com/iiot/p/8527533.html