ribbonfeign超时时间分析

  • ribbonFeign默认超时时间都是1s
  • 下面是RibbonClientConfiguration 类,里面指明了ribbon默认连接超时时间默认读取超时时间都是1s
  • 配置方法

feign: # 设置 feign 超时时间 client: config: # default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间 #超时时间默认为1s default: #不设置connectTimeout会导致readTimeout设置不生效 #建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间 connectTimeout: 5000 #指建立连接后从服务端读取到可用资源所用的时间 readTimeout: 5000 #设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ConnectTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ReadTimeout: 5000

  • 注意:FeignRibbon 的超时时间只会有一个生效
  • 当我们没有显式配饰feign的超时时间的是时候,如果配置了ribbon的超时时间,则只有这个配置会生效,feign默认的1s超时无效
  • 如果我们feignribbon的超时时间都配置了,会以feign配置的为准

hystrix超时时间分析

  • hystrix 的默认超时时间是 1s,这个配置在 HystrixCommandProperties 类中:
private static final Integer default_executionTimeoutInMilliseconds = 1000;
  • 配置方法:

# 设置 hystrix 超时时间 feign: hystrix: enabled: true #注意:这个hystrix要单独配置才会生效,不能接着上面的feign里面的hystrix配置,那样是无效的 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 6000

  • 注意:我们如果没有开启feignhystrix功能的话那么hystrix的超时时间就不会生效,即有没有配置

    • feign:
        hystrix:
          enabled: true
  • 如果配置了hystrix功能,那么它的超时时间默认就是开启的,且该时间是1秒,这个时间和ribbon的超时时间会同时起作用,不像上面的feign的超时时间和ribbon超时时间二选一,我们可以通过上面的配置hystrix的超时时间让它更长,或者显式禁用hystrix的超时时间:

    • hystrix:
        command:
          default:
            execution:
              timeout:
              #这里表示禁用hystrix的超时时间限制
                enabled: false

      注意:如果我们禁用了hystrix的超时时间配置,那么我们在方法上用@HystrixCommand里这样配置超时时间也会失效:

      @HystrixCommand(fallbackMethod = "xxxxx",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
      })

      • 也就是说这里的1.5s超时配置无效
  • 开启feignhystrix功能后我们可以通过注解在方法上面配置针对该方法的超时时间,这个时间限制是在上面配置文件之后的,即先判断时间是否超出配置文件中的(没配置就是默认1s),再判断是否超出当前注解里面规定的

@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500") })

  • 如果注解里面禁用了超时时间配置,那么这里也不会生效
  • 再次提醒:hystrix的超时时间配置和ribbon的超时时间配置是同时生效的
  • 例如如果我们远程调用另一服务,而另一服务需要运行3s,那么此时我们如果不想报错,就需要同时配置hystrixribbon的超时时间超过3s:
#只有在feign中开启了hystrix功能后,hystrix的超时时间才回生效,如果我们压根不使用hystrix的功能就不用配置了
feign:
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ReadTimeout: 5000
  ConectTimeout: 5000