Spring Cloud 项目各种超时时间设置详解

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: 600000
    hystrix:
        command:
          default:  #default全局有效,service id指定应用有效
            execution:
              isolation:
                thread:
                  timeoutInMilliseconds: 1000 #断路器超时时间,默认1000ms                 
    

    有任何问题欢迎关注公众号私信我,一起探讨,一起学习
    在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值