- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
属性详解
在之前介绍Hystrix的使用方法时,已经涉及过一些Hystrix属性的配置,我们可以根据实现HystrixCommand的不同方式将配置方法分为如下两类。
- 当通过继承的方式实现时,可使用Setter对象来对请求命令的属性进行设置,比如下面的例子:
public HystrixCommandInstance(int id){
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(500)));
this.id=id;
}
- 当通过注解的方法实现时,只需使用@HystrixCommand 中的 commandProperties属性来设置,比如:
@HystrixCommand(commandKey="helloKey",
commandProperties={
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
}
)
public User getUserById(Long id){
return restTemplate.getForObject("http://USER-SERVICE/users/{1}",User.class,id);
}
实际上,Hystrix为我们提供的配置内容和配置方式远不止上面这些,它提供了非常丰富和灵活的配置方法,下面我们将详解介绍HystrixPropertiesStrategy实现的各项配置属性。在具体说明这些属性之前,我们需要了解一下这些属性都存在下面4个不同优先级别的配置(优先级由低到高)。
- 全局默认值: 如果没有设置下面三个级别的属性,那么这个属性就是默认值。由于该属性通过代码定义,所以对于这个级别,我们主要关注它在代码中定义的默认值即可。
- 全局配置属性: 通过在配置文件中定义全局属性值,在应用启动时或在与 Spring Cloud Config和Spring Cloud Bus实现的动态刷新配置功能配合下,可以实现对“全局默认值”的覆盖以及在运行期对“全局默认值”的动态调整。
- 实例默认值: 通过代码为实例定义的默认值。通过代码的方式为实例设置属性值来覆盖默认的全局配置。
- 实例配置属性: 通过配置文件来为指定的实例进行属性配置,以覆盖前面的三个默认值。它也可用Spring Cloud Config和Spring Cloud Bus实现的动态刷新配置功能实现对具体实例配置的动态调整。
通过理解Hystrix 4个级别的属性配置,对设置Hystrix的默认值以及在线上如何根据实际情况去调整配置非常有帮助,下面我们来具体看看它有哪些具体的属性配置。
Command属性
Command属性主要用来控制HystrixCommand命令的行为。
它主要有下面5种不同类型的属性配置。
execution配置
execution配置控制的是HystrixCommand.run()的执行。
- execution.isolation.strategy:该属性用来设置HystrixCommand.run()执行的隔离策略,它有如下两个选项。
- THREAD:通过线程池隔离的策略。它在独立的线程上执行,并且它的并发限制受线程池中线程数量的限制。
- SEMAPHORE:通过信号量隔离的策略。它在调用线程上执行,并且它的并发限制受信号量计数的限制。
- execution.isolation.thread.timeoutInMilliseconds:该属性用来配置HystrixCommand执行的超时时间,单位为毫秒。当HystrixCommand执行时间超过该配置值之后,Hystrix会将该执行命令标记为TIMEOUT并进入服务降级处理逻辑。
续表
- execution.timeout.enabled:该属性用来配置HystrixCommand.run()的执行是否启用超时时间。默认为true,如果设置为false,那么 execution.isolation.thread.timeoutInMilliseconds属性的配置将不再起作用。
- 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可以被调用了)。
- fallback.enabled:该属性用来设置服务降级策略是否启用,如果设置为false,那么当请求失败或者拒绝发生时,将不会调用 HystrixCommand.getFallback()来执行服务降级逻辑。
circuitBreaker配置
下面这些是断路器的属性配置,用来控制HystrixCircuitBreaker的行为。
- circuitBreaker.enabled:该属性用来确定当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求。
- circuitBreaker.requestVolumeThreshold:该属性用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,如果滚动时间窗(默认10秒)内仅收到了19个请求,即使这19个请求都失败了,断路器也不会打开。
- circuitBreaker.sleepWindowInMilliseconds:该属性用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,会将断路器置为“半开”状态,尝试熔断的请求命令,如果依然失败就将断路器继续设置为“打开”状态,如果成功就设置为“关闭”状态。
- circuitBreaker.errorThresholdPercentage:该属性用来设置断路器打开的错误百分比条件。例如,默认值为5000的情况下,表示在滚动时间窗中,在请求数量超过 circuitBreaker.requestVolumeThreshold 阈值的前提下,如果错误请求数的百分比超过50,就把断路器设置为“打开”状态,否则就设置为“关闭”状态。
续表
- circuitBreaker.forceOpen:如果将该属性设置为true,断路器将强制进入“打开”状态,它会拒绝所有请求。该属性优先于 circuitBreaker.forceClosed属性。
- circuitBreaker.forceClosed:如果将该属性设置为true,断路器将强制进入“关闭”状态,它会接收所有请求。如果circuitBreaker.forceOpen属性为true,该属性不会生效。
metrics配置
下面的属性均与HystrixCommand和HystrixObservableCommand执行中捕获的指标信息有关。
- metrics.rollingStats.timeInMilliseconds:该属性用来设置滚动时间窗的长度,单位为毫秒。该时间用于断路器判断健康度时需要收集信息的持续时间。断路器在收集指标信息的时候会根据设置的时间窗长度拆分成多个“桶”来累计各度量值,每个“桶”记录了一段时间内的采集指标。例如,当采用默认值10000毫秒时,断路器默认将其拆分成10个桶(桶的数量也可通过 metrics.rollingStats.numBuckets参数设置),每个桶记录1000毫秒内的指标信息。
注意:该属性从Hystrix 1.4.12版本开始(Brixton.SR5版本中使用了1.5.3版本),只有在应用初始化的时候生效,通过动态刷新配置不会产生效果,这样做是为了避免出现运行期监测数据丢失的情况。
- metrics.rollingStats.numBuckets:该属性用来设置滚动时间窗统计指标信息时划分“桶”的数量。
注意:metrics.rollingStats.timeInMilliseconds 参数的设置必须能够被metrics.rollingStats.numBuckets参数整除,不然将抛出异常。该参数与 metrics.rollingStats.timeInMilliseconds 一样,从 Hystrix 1.4.12版本开始(Brixton.SR5版本中使用了1.5.3版本),只有在应用初始化的时候生效,通过动态刷新配置不会产生效果,这样做是为了避免出现运行期监测数据丢失的情况。
- metrics.rollingPercentile.enabled:该属性用来设置对命令执行的延迟是否使用百分位数来跟踪和计算。如果设置为false,那么所有的概要统计都将返回-1。
- metrics.rollingPercentile.timeInMilliseconds:该属性用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。
注意:该属性从Hystrix 1.4.12版本开始(Brixton.SR5版本中使用了1.5.3版本),只有在应用初始化的时候生效,通过动态刷新配置不会产生效果,这样做是为了避免出现运行期监测数据丢失的情况。
- metrics.rollingPercentile.numBuckets:该属性用来设置百分位统计滚动窗口中使用“桶”的数量。
注意:metrics.rollingPercentile.timeInMilliseconds 参数的设置必须能够被metrics.rollingPercentile.numBuckets参数整除,不然将会抛出异常。该属性从Hystrix 1.4.12版本开始(Brixton.SR5版本中使用了1.5.3版本),只有在应用初始化的时候生效,通过动态刷新配置不会产生效果,这样做是为了避免出现运行期监测数据丢失的情况。
- metrics.rollingPercentile.bucketSize:该属性用来设置在执行过程中每个“桶”中保留的最大执行次数。如果在滚动时间窗内发生超过该设定值的执行次数,就从最初的位置开始重写。例如,将该值设置为100,滚动窗口为10秒,若在10秒内一个“桶”中发生了500次执行,那么该“桶”中只保留最后的100次执行的统计。另外,增加该值的大小将会增加内存量的消耗,并增加排序百分位数所需的计算时间。
续表
注意:该属性从Hystrix 1.4.12版本开始(Brixton.SR5版本中使用了1.5.3版本),只有在应用初始化的时候生效,通过动态刷新配置不会产生效果,这样做是为了避免出现运行期监测数据丢失的情况。
- metrics.healthSnapshot.intervalInMilliseconds:该属性用来设置采集影响断路器状态的健康快照(请求的成功、错误百分比)的间隔等待时间。
requestContext配置
下面这些属性涉及HystrixCommand使用的HystrixRequestContext的设置。
- requestCache.enabled:此属性用来配置是否开启请求缓存。
- requestLog.enabled:该属性用来设置 HystrixCommand 的执行和事件是否打印日志到HystrixRequestLog中。
collapser属性
该属性除了在代码中用 set 和配置文件配置之外,也可使用注解进行配置。可使用@HystrixCollapser中的collapserProperties属性来设置,比如:
@HystrixCollapser(batchMethod="batch",collapserProperties={
@HystrixProperty(name="timerDelayInMilliseconds",value="20")
})
下面这些属性用来控制命令合并相关的行为。
- maxRequestsInBatch:该参数用来设置一次请求合并批处理中允许的最大请求数。
- timerDelayInMilliseconds:该参数用来设置批处理过程中每个命令延迟的时间,单位为毫秒。
- requestCache.enabled:该参数用来设置批处理过程中是否开启请求缓存。
threadPool属性
该属性除了在代码中用 set 和配置文件配置之外,还可使用注解进行配置。可使用@HystrixCommand中的threadPoolProperties属性来设置,比如:
@HystrixCommand(fallbackMethod="helloFallback",commandKey="helloKey",
threadPoolProperties={
@HystrixProperty(name="coreSize",value="20")
}
)
下面这些属性用来控制Hystrix命令所属线程池的配置。
- coreSize:该参数用来设置执行命令线程池的核心线程数,该值也就是命令执行的最大并发量。
- maxQueueSize:该参数用来设置线程池的最大队列大小。当设置为-1时,线程池将使用SynchronousQueue实现的队列,否则将使用LinkedBlockingQueue实现的队列。
续表
注意:该属性只有在初始化的时候才有用,无法通过动态刷新的方式来调整。
- queueSizeRejectionThreshold:该参数用来为队列设置拒绝阈值。通过该参数,即使队列没有达到最大值也能拒绝请求。该参数主要是对LinkedBlockingQueue队列的补充,因为LinkedBlockingQueue队列不能动态修改它的对象大小,而通过该属性就可以调整拒绝请求的队列大小了。
注意:当maxQueueSize属性为-1的时候,该属性不会生效。
- metrics.rollingStats.timeInMilliseconds:该参数用来设置滚动时间窗的长度,单位为毫秒。该滚动时间窗的长度用于线程池的指标度量,它会被分成多个“桶”来统计指标。
续表
- metrics.rollingStats.numBuckets:该参数用来设置滚动时间窗被划分成“桶”的数量。
注意:metrics.rollingStats.timeInMilliseconds 参数的设置必须能够被metrics.rolling-Stats.numBuckets参数整除,不然将会抛出异常。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论