SpringCloud远程调用超时时间
in 默认分类 with 0 comment 17 views

SpringCloud远程调用超时时间

in 默认分类 with 0 comment 17 views

背景

使用fegin客户端远程调用,开启了hystrix熔断器。

feign:
  hystrix:
    enabled: true

由于服务提供者需要调第三方接口,耗时大概在几百毫秒才能执行完。
但发现服务消费者总是报超时(啪的一下,很快啊),记录了下远程调用的时间,几乎是1秒的时间就返回超时错误了。

解决方案

使用FallbackFactory查看报错信息,报的错是com.netflix.hystrix.exception.HystrixTimeoutException,Timeout自然是超时,既然是hystrix的错,设置6秒试试:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000

这个属性在idea中没有提示,需要去官方文档看:Hystrix文档
试了下确实是不再报错了,但为了保险起见,在服务提供者打个断点,让他超时6秒看看fallback是否正常工作,发现2秒的时候报了另一个连接超时的错feign.RetryableException,查了一番才知道还需要设置ribbon的超时时间:

ribbon:
  ReadTimeout: 6000
  ConnectTimeout: 6000

设置完后就能正常工作,6秒后也能触发fallback。

总结

hystrix的默认超时时间是1秒,而ribbon的默认超时时间是2秒。
一个远程调用的请求过程是:

fegin -> hystrix -> ribbon -> httpClient

所以两个需要同时设置才能生效,不然会以最小的超时时间作为限制。
整体的yml配置:

feign:
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ReadTimeout: 6000
  ConnectTimeout: 6000
Responses