1、本文主要内容
  • 服务之间调用Hystrix针对单个方法超时时间设置
  • Spring Cloud Gateway 针对单独URL的超时时间设置

2、超时时间设置场景

通常整个系统会有统一的接口超时时间设定,一般情况下的增删改查也都会比较快,但也会存在一些特殊的业务场景,接口需要的较长的超时时间,比如:上传(较大文件)、下载等等。

这种默认的超时设置就不能满足了,如果统一把超时时间都设置长,就起不到超时熔断的效果了。

再有一种情况,在有定时任务的项目中,默认的1秒、2秒超时时间,显然也不能满足了,这时候我们就需要针对具体的方法设置单独的超时熔断时间了。

在Spring Cloud 项目里面,超时时间的设置通常有三个层面:

  • 网关(Gateway、zuul等)
  • ribbon
  • 熔断器Hystrix

通常来讲,网关的超时时间是最长的,假设服务调用链路是 网关-A服务-B服务,网关超时时间应该是调用链总和,其次是Hystrix的超时时间也应该比ribbon的时间长,因为ribbon存在重试机制。

3、设置方法

微服务之间调用超时时间设置

目前大部分微服务项目,都是在Spring Cloud的体系下搭建的架构,既然是微服务项目,那相对应的在一个项目中就会存在服务之间的调用,目前比较常用的都是通过openfeign来进行调用,那么如何设置超时时间呢?

openfeign是集成有负载均衡ribbon、熔断器hystrix的,所以超时时间,就需要针对这两个进行设置。

  • ribbon

ribbon:  OkToRetryOnAllOperations: false # 对所有操作请求都进行重试,默认false  ReadTimeout: 10000   # 负载均衡超时时间,默认值5000  ConnectTimeout: 2000 # ribbon请求连接的超时时间,默认值2000  MaxAutoRetries: 0     # 对当前实例的重试次数,默认0  MaxAutoRetriesNextServer: 1 # 对切换实例的重试次数,默认1
  • hystrix

hystrix:  command:    default:  # default全局有效,service id指定应用有效      execution:        timeout:          enabled: true        isolation:          thread:            timeoutInMilliseconds: 200000 # 断路器超时时间,默认1000ms    # 针对单个服务及方法的设置方法    RemoteMaterialService#saveMaterialInfo(MaterialInfo):      execution:        timeout:          enabled: true        isolation:          thread:            timeoutInMilliseconds: 600000 # 断路器超时时间,默认1000ms

Hystrix针对单个服务设置超时时间语法

类名#方法名(参数类型,参数类型……)

类名:要设置的某个FeignClient的类名

方法名:设置FeignClient里面的方法

参数类型:方法里面需要传入的参数。如果是基础类型,就直接填基础类型:String/int等;如果是某个对象,就直接填对象的类名

  • ribbon与hystrix之间的超时时间关系:

    • 如果hystrix.command.default.execution.timeout.enabled为true,则会有两个执行方法超时的配置,一个就是ribbon的ReadTimeout,一个就是熔断器hystrix的timeoutInMilliseconds, 此时谁的值小谁生效
    • 如果hystrix.command.default.execution.timeout.enabled为false,则熔断器不进行超时熔断,而是根据ribbon的ReadTimeout抛出的异常而熔断,也就是取决于ribbon
    • ribbon的ConnectTimeout,配置的是请求服务的超时时间,除非服务找不到,或者网络原因,这个时间才会生效
    • 由于ribbon的重试机制,通常熔断的超时时间需要配置的比ReadTimeout长,ReadTimeoutConnectTimeout长,否则还未重试,就熔断了
    • 为了确保重试机制的正常运作,理论上(以实际情况为准)建议hystrix的超时时间为:(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout
网关Gateway

项目中有网关层之后,所有的前端请求都会从网关过一下,然后网关根据规则将请求分发到不同的服务Server。网关Gateway是自动集成有ribbon的,当然也有熔断Hystrix,所以设置超时时间,也要从这两个地方入手。

  • 自定义一个熔断工厂,支持指定请求路径设置超时时间,代码就不粘贴了,很长,影响思路,有需要的可以公众号内回复【SpecialHystrix】获取。

    这个完全是根据源码改写的,小伙伴可以自行与源码对比哈

  • Gateway使用自定义熔断工厂配置路由实例

cloud:    gateway:      routes:        #system 模块        - id: cloud-system          uri: lb://cloud-system          predicates:            - Path=/system/**          filters:            - StripPrefix=1              # 降级配置            - name: SpecialHystrix # 指定自定义熔断工厂              args:                id: SpecialHystrix                fallbackUri: 'forward:/fallback'                timeout:                  #指定接口超时处理                  test-hell: 6000                  #本地导出78万数据用了510s                  rawMaterialStock-exportRawMaterial: 600000hystrix:    command:      default:  #default全局有效,service id指定应用有效        execution:          isolation:            thread:              timeoutInMilliseconds: 1000 #断路器超时时间,默认1000ms

觉得有用就顺手转发、点赞、在看三连走一波吧,非常感谢!


长按/扫码关注我吧,会找到你想要的……2c315f670379c4e1d0d5a9049e5518f0.png 

0e4eaf7931728c57b2b3b70c3abd2dcf.png

   喜欢就点个在看吧f1fa1c0ca7c965a0fd4545e650632bb2.png

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐