背景
对于 Hystrix 的配置,我们在平时使用过程经常会出现这样的问题,以为理所应当的配置,其实际上并不会起作用。通过复制粘贴的代码,如果没有经过斟酌,可能永远都没有起到其应该起到的作用。这就是我们为何要将 Hystrix 配置搞清楚的原因。
HystrixCommand 注解属性
@HystrixCommand
注解上的属性。对于 HystrixCommand 注解属性,一般有两种方式,一种是给某个类添加全局配置,一种是针对各个方法添加。
全局配置一般需要借助 @DefaultProperties
注解。除了仅针对方法级别的属性以外(commandKey/observableExecutionMode/fallbackMethod
),其他的都可以通过该注解来配置。当一个类中有多个 Hystrix 方法时,这种方式可以减少各个方法上都是相同配置的冗余代码。
局部配置一般是通过在方法上添加 @HystrixCommand
并配置注解参数来实现。这种配置的方式的优先级高于全局配置注解 @DefaultProperties
。
commandKey
唯一标识一个 Hystrix 方法。默认会取被 @HystrixCommand
注解的方法名。建议要起一个全局独一无二的名称,防止多个方法因为 commandKey
名称重复而相互影响。
groupKey
为 Hystrix 方法的分组标识。默认取当前运行时的方法的类名。
threadPoolKey
用来标识一个线程池的 key。默认取 groupKey 的值。一般来说同一个类中共用同一个线程池。若共用同一个线程池的不同的方法,配置了相同的线程池属性,在第一个方法被执行后线程池的属性就已经被固定,因此会以第一个被执行的方法上的配置为主。
fallbackMethod
方法执行时,出现熔断、超时、异常等错误时会触发该属性配置的回退方法。该方法需要保持与 Hystrix 方法的签名和返回值一致。
ignoreExceptions
指定哪些异常需要被 Hystrix 忽略,忽略的异常会被直接抛到方法上层,不会触发 fallbackMethod
回退方法,也不会参与到失败率的统计中而影响熔断的状态。
observableExecutionMode
TODO 搞清楚Observable调用逻辑。
当 Hystrix 命令被包装成 RxJava 的 Observer 异步执行时,此配置指定了 Observable 被执行的模式,默认是 ObservableExecutionMode.EAGER,Observable 会在被创建后立刻执行,而 ObservableExecutionMode.EAGER模式下,则会产生一个 Observable 被 subscribe 后执行。
当 @HystrixCommand
注解的方法返回值为 Observable
类型或其子类时生效。默认值为 ObservableExecutionMode.EAGER
。我们常见的命令都是同步执行的,此配置项可以不配置。
raiseHystrixExceptions
当配置项中包含 HystrixException.RUNTIME_EXCEPTION
时,所有未被忽略的异常统一包装成 HystrixRuntimeException
,方便将异常统一处理。默认值为 {}
。
defaultFallback
默认回退方法,当配置 fallbackMethod
项时此项不会生效,另外,默认回退方法不能有参数,返回值要与 Hystrix方法的返回值一致。
commandProperties
与 Hystrix 命令属性相关的配置。下文会有详细解释。
threadPoolProperties
与 Hystrix 命令执行线程池相关的属性。下文会有详细解释。
命令属性(commandProperties)
commandProperties
的命令属性是由 @HystrixProperty
数组配置组成。其中 @HystrixProperty
是由 name
和 value
两个属性构成,并且这两个属性都是字符串类型。其属性都是以 hystrix.command.*
开头,全局默认属性是 hystrix.command.default.*
, 具体方法的属性 hystrix.command.HystrixCommandKey(具体CommandKey名).*
。具体的配置如下。
执行属性(Execution)
接下来介绍的属性,是控制 HystrixCommand.run()
方法如何执行的属性。
execution.isolation.strategy
该属性表示指定