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
长,ReadTimeout
比ConnectTimeout
长,否则还未重试,就熔断了 - 为了确保重试机制的正常运作,理论上(以实际情况为准)建议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
有任何问题欢迎关注公众号私信我,一起探讨,一起学习