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所示。

image 2024 04 01 12 27 10 075
Figure 1. 表13.1 execution.isolation.strategy的属性配置

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:用来设置采集影响断路器状态的健康快照的间隔等待时间。

RequestContext配置

涉及 HystrixCommand 使用 HystrixRequestContext 设置。

requestCache.enabled:用来设置是否开启请求缓存。

requestLog.enabled:用来设置 HystrixCommand 的执行和事件是否输出到日志的 HystrixRequestLog。