前言
不久前在部门周会上分享了 Hystrix 源码解析之后,就无奈地背上了专家包袱,同事们都认为我对 Hystrix 很熟,我们接触 Hystrix 更多的还是工作中的使用和配置,所以很多人一遇到 Hystrix 的配置问题就会过来问我。为了不让他们失望,我把 Hystrix 的 配置文档 仔细看了一遍,将有疑问的点通过翻源码、查官方 issue、自己实验的方式整理了一遍,这才对 Hystrix 的配置有了一定的了解。
在了解这些配置项的过程中,我也发现了很多坑,平常我们使用中认为理所应当的值并不会让 Hystrix 如期望工作,没有经过斟酌就复制粘贴的配置会让 Hystrix 永远不会起作用。于是写下本文,希望能帮助小伙伴们掌握 Hystrix。
HystrixCommand
配置方式
我们的配置都是基于 HystrixCommand 的,我们通过在方法上添加 @HystrixCommand
注解并配置注解的参数来实现配置,但有的时候一个类里面会有多个 Hystrix 方法,每个方法都是类似配置的话会冗余很多代码,这时候我们可以在类上使用 @DefaultProperties
注解来给整个类的 Hystrix 方法设置一个默认值。
配置项
下面是 HystrixCommand 支持的参数,除了 commandKey/observableExecutionMode/fallbackMethod
外,都可以使用 @DefaultProperties
配置默认值。
-
commandKey:用来标识一个 Hystrix 命令,默认会取被注解的方法名。需要注意:
Hystrix 里同一个键的唯一标识并不包括 groupKey
,建议取一个独一二无的名字,防止多个方法之间因为键重复而互相影响。 -
groupKey:一组 Hystrix 命令的集合, 用来统计、报告,默认取类名,可不配置。
-
threadPoolKey:用来标识一个线程池,
如果没设置的话会取 groupKey
,很多情况下都是同一个类内的方法在共用同一个线程池,如果两个共用同一线程池的方法上配置了同样的属性,在第一个方法被执行后线程池的属性就固定了,所以属性会以第一个被执行的方法上的配置为准。 -
commandProperties:与此命令相关的属性。
-
threadPoolProperties:与线程池相关的属性,
-
observableExecutionMode:当 Hystrix 命令被包装成 RxJava 的 Observer 异步执行时,此配置指定了 Observable 被执行的模式,默认是
ObservableExecutionMode.EAGER
,Observable 会在被创建后立刻执行,而ObservableExecutionMode.EAGER
模式下,则会产生一个 Observable 被 subs