Hystrix的配置
本小节,会对属性的配置做一个系统的说明,然后详细地介绍 Command 属性。
属性配置说明
在上文介绍 Hystrix 时,也涉及属性的配置。在这一节则进行一个系统的归纳总结,让读者全面了解属性的问题。根据实现 HystrixCommand 的不同方式有两种不同的配置方法。
继承的方式
这种方式在前面的程序实例中被使用过,我们可以通过 Setter 对象的方式对属性进行设置。在前面的 HelloHystrixCommand 代码上修改,代码如下所示。
package com.cloudtest.eurekaconsumer.hystrix;
public class HelloHystrixCommand extends HystrixCommand {
private final String name;
public HelloHystrixCommand(String name) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandPropertiesDefaults(HystrixCommandProperties.
Setter().withExecutionTimeoutInMilliseconds(2000)));
this.name = name;
}
@Override
protected String run() {
return "Hello " + name;
}
}
在上面的代码中,设置了超时时间。
注解的方式
对于注解的方式我们在前面也说明过,只需要使用 @HystrixCommand 注解中的 commandProper-Ties 属性来设置即可。实例如下。
@HystrixCommand(commandProperties = {
//设置熔断
@HystrixProperty(name="circuitBreaker.enabled",value = "true"),
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value= "10"),
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value = "10"),
})
@GetMapping("/consumer")
public String consumer(@RequestParam("number") Integer number){
//省略
}
属性配置
在属性配置中,需要考虑优先级与属性的具体配置。
优先级
Hystrix 不仅有上面的配置内容,还存在更加灵活的配置方式和方法。先说明属性配置的优先级。优先级从低到高,主要分为下面四个级别。
-
全局默认值:通过源码可以看到。
-
全局配置属性:可以通过配置文件定义全局属性。
-
实例默认值:为实例定义默认值。
-
实例配置属性:为实例定义配置属性。
配置application.properties
下面将分别介绍如何配置全局默认属性和实例配置属性。
全局默认属性使用 application.properties 进行配置,主要有两个步骤。
首先,配置 application.properties。需要写上 hystrix.command.default 前缀,代码如下所示。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
然后,需要在方法上配置注解 @HystrixCommand。
实例配置属性:通过注解 @HystrixCommand 下的 hystrixKey 进入,我们可以看到如下的代码注解。
/**
* Hystrix command key.
* <p/>
* default => the name of annotated method. for example:
* <code>
* ...
* @HystrixCommand
* public User getUserById(...)
* ...
* the command name will be: 'getUserById'
* </code>
*
* @return command key
*/
String commandKey() default " ";
在默认的全局中使用 default 即可,如果想单独为 getUserById 方法设置属性,则需要将 default 换成 getUserById。下面举例。
在服务消费者应用中有一个服务是 “/consumer”,方法是 consumer,这时对其设置实例的熔断器。首先,添加一个注解 @HystrixCommand,然后修改 application.properties,代码如下所示。
hystrix.command.consumer.circuitBreaker.enabled=true
hystrix.command.consumer.circuitBreaker.requestVolumeThreshold=10
hystrix.command.consumer.circuitBreaker.sleepWindowInMilliseconds=10000
hystrix.command.consumer.circuitBreaker.errorThresholdPercentage=60
Command属性
Command 属性主要用来控制 HystrixCommand 命令的行为,它主要分为五个类别,分别为 execution 配置、fallback 配置、circuitBreaker 配置、metrics 配置、requestContext 配置。这里介绍它们的属性配置。
execution配置
用来控制 HystrixCommand.run() 的执行。
execution.isolation.strategy:该属性用来设置 HystrixCommand.run() 执行的隔离策略,如表13.1所示。

THREAD:线程池隔离。
SEMAPHORE:信号量隔离。
execution.isolation.thread.timeoutInMilliseconds:该属性用来配置 HystrixCommand 执行的超时时间,单位为毫秒,默认为1000ms。
execution.timeout.enabled:该属性用来配置 HystrixCommand.run() 的执行是否启用超时时间。默认为 true,如果是 false,则设置的超时时间不再起作用。
execution.isolation.thread.interruptOnTimeout:该属性用来配置当 HystrixCommand.run() 执行超时的时候是否中断它。
execution.isolation.thread.interruptOnCancel:该属性用来配置当 HystrixCommand.run() 执行取消时是否中断它。
execution.isolation.semaphore.maxConcurrentRequests:当 HystrixCommand 命令的隔离策略使用信号量隔离时,该属性用来配置信号量的大小。当最大并发请求达到该设置值时,后续的请求将被拒绝。
Fallback配置
用来控制 HystrixCommand.getFallback() 的执行。
fallback.isolation.semaphore.maxConcurrentRequests:该属性用来设置从调用线程中允许 HystrixCommand.getFallback() 方法执行的最大并发请求数。当达到最大并发请求时,后续的请求将会被拒绝并抛出异常。
fallback.enabled:该属性用来设置服务降级策略是否启用,默认是 true。如果设置为 false,当请求失败或者拒绝发生时,将不会调用 HystrixCommand.getFallback() 来执行服务降级策略。
CircuitBreaker配置
用来控制 HystrixCircuitBreaker 的行为。
circuitBreaker.enabled:确定当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求。默认为 true。
circuitBreaker.requestVolumeThreshold:用来设置在滚动时间窗中,断路器熔断的最小请求数。例如默认值为 20 时,如果滚动时间窗(默认 10s)内仅收到 19 个请求,即使这 19 个请求都失败了,断路器也不会打开。
circuitBreaker.sleepWindowInMilliseconds:用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,会将断路器设置为半开状态,尝试熔断的请求命令,如果失败就将断路器继续设置为打开状态,如果成功就设置为关闭状态。
circuitBreaker.errorThresholdPercentage:该属性用来设置断路器打开的错误百分比条件。默认值为 50,表示在滚动时间窗中,在请求值超过 requestVolumeThreshold 阈值的前提下,如果错误请求数百分比超过 50,就把断路器设置为打开状态,否则就设置为关闭状态。
circuitBreaker.forceOpen:该属性默认为 false。如果该属性设置为 true,断路器将强制进入打开状态,它会拒绝所有请求。该属性优于 forceClosed 属性。
circuitBreaker.forceClosed:该属性默认为 false。如果该属性设置为 true,断路器强制进入关闭状态,它会接收所有请求。如果 forceOpen 属性为 true,该属性不生效。
Metrics配置
该属性与 HystrixCommand 和 HystrixObservableCommand 执行中捕获的指标相关。
metrics.rollingStats.timeInMilliseconds:该属性用来设置滚动时间窗的长度,单位为毫秒。该时间用于断路器判断健康度时需要收集指标信息的持续时间。断路器在收集指标信息时会根据设置的滚动时间窗长度拆分成多个 “桶” 来累计各度量值,每个 “桶” 记录了一段时间的采集指标。例如,当默认值为 10000ms 时,断路器默认将其分成 10 个 “桶”,每个 “桶” 记录 1000ms 内的指标信息。
metrics.rollingStats.numBuckets:用来设置滚动时间窗统计指标信息时划分 “桶” 的数量,默认值为 10。
metrics.rollingPercentile.enabled:用来设置对命令执行延迟是否使用百分位数来跟踪和计算。默认为 true,如果设置为 false,那么所有的概要统计都将返回 -1。
metrics.rollingPercentile.timeInMilliseconds:用来设置百分位数统计的滚动时间窗口的持续时间,单位为毫秒。
metrics.rollingPercentile.numBuckets:用来设置百分位数统计滚动时间窗口中使用 “桶” 的数量。
metrics.rollingPercentile.bucketSize:用来设置每个 “桶” 中保留的最大执行数。
metrics.healthSnapshot.intervalInMilliseconds:用来设置采集影响断路器状态的健康快照的间隔等待时间。