不久前在部门周会上分享了 Hystrix 源码解析之后,就无奈地背上了专家包袱,同事们都认为我对 Hystrix 很熟,我们接触 Hystrix 更多的还是工作中的使用和配置,所以很多人一遇到 Hystrix 的配置问题就会过来问我。为了不让他们失望,我把 Hystrix 的 配置文档 仔细看了一遍,将有疑问的点通过翻源码、查官方 issue、自己实验的方式整理了一遍,这才对 Hystrix 的配置有了一定的了解。
在了解这些配置项的过程中,我也发现了很多坑,平常我们使用中认为理所应当的值并不会让 Hystrix 如期望工作,没有经过斟酌就复制粘贴的配置会让 Hystrix 永远不会起作用。于是写下本文,希望能帮助小伙伴们掌握 Hystrix。如果想了解 Hystrix 的话,可以搭配我之前的分享 PPT:Hystrix 源码解析
文章欢迎转载,请尊重作者劳动成果,带上原文链接:https://www.cnblogs.com/zhenbianshu/p/9630167.html
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 被 subscribe 后执行。我们常见的命令都是同步执行的,此配置项可以不配置。
ignoreExceptions:默认 Hystrix 在执行方法时捕获到异常时执行回退,并统计失败率以修改熔断器的状态,而被忽略的异常则会直接抛到外层,不会执行回退方法,也不会影响熔断器的状态。
raiseHystrixExceptions:当配置项包括 HystrixRuntimeException 时,所有的未被忽略的异常都会被包装成 HystrixRuntimeException,配置其他种类的异常好像并没有什么影响。
fallbackMethod:方法执行时熔断、错误、超时时会执行的回退方法,需要保持此方法与 Hystrix 方法的签名和返回值一致。
defaultFallback:默认回退方法,当配置 fallbackMethod 项时此项没有意义,另外,默认回退方法不能有参数,返回值要与 Hystrix方法的返回值相同。
commandProperties 配置方式Hystrix 的命令属性是由 @HystrixProperty 注解数组构成的,HystrixProperty 由 name 和 value 两个属性,数据类型都是字符串。
以下将所有的命令属性分组来介绍。
线程隔离(Isolation)
execution.isolation.strategy: 配置请求隔离的方式,有 threadPool(线程池,默认)和 semaphore(信号量)两种,信号量方式高效但配置不灵活,我们一般采用 Java 里常用的线程池方式。
execution.timeout.enabled:是否给方法执行设置超时,默认为 true。
execution.isolation.thread.timeoutInMilliseconds:方法执行超时时间,默认值是 1000,即 1秒,此值根据业务场景配置。
execution.isolation.thread.interruptOnTimeout: execution.isolation.thread.interruptOnCancel:是否在方法执行超时/被取消时中断方法。需要注意在 JVM 中我们无法强制中断一个线程,如果 Hystrix 方法里没有处理中断信号的逻辑,那么中断会被忽略。