为了更好的使用Hystrix,此处将Hystrix的完整配置进行说明。在Hystrix中,一切的起源都是HystrixCommand或者HystrixObservableCommand,此处主要针对HystrixCommand,主要包括标识(key)配置,命令执行(execution)配置、命令降级(fallback)配置、熔断器(circuit breaker)配置、度量统计(metrics)配置和请求上下文配置。
配置的方式可以可以分为注解配置和配置文件配置,注解配置主要是在@HystrixCommand(单个Command配置)和@DefaultProperties(Command group配置),配置文件方式配置既可以进行单个Command配置,也可以根据Command group进行配置,还可以针对当前服务的所有Command group进行配置。当当前服务只有一个服务接口类的时候,根据Command group进行配置等价于全局配置。
HystrixCommandKey:在Hystrix中,每一个HystrixCommand都有一个唯一的标识,是必须项,如果不配置,默认值是@HystrixCommand标注的方法名,即每个方法会被当做一个HystrixCommand。
注意:大部分的Hystrix配置都是和HystrixCommandKey绑定的。
HystrixCommandGroupKey:在Hystrix中,将所有的HystrixCommand分组,每一个组的唯一标识叫做GroupKey。分组之后便于统计展示于仪表盘、上传报告和预警等等,也就是说,HystrixCommandGroupKey是Hystrix内部进行度量统计时候的分组标识,数据上报和统计的最小维度就是分组的KEY 。必须项,如果不进行配置,默认值是使用@HystrixCommand标注的方法所在的类名 。
HystrixThreadPoolKey:在Hystrix中,每一组Hystrix命令的执行都有一个独立的线程池,此线程池的唯一标识就叫做HystrixThreadPoolKey,必须项,如果不进行配置,会使用默认使用HystrixCommandGroupKey。
execution.isolation.strategy:隔离策略,决定Hystrix命令(包括Hystrix和HystrixObservableCommand)执行的时候采用什么类型的策略进行依赖隔离。可以选择线程池(THREAD)或者信号量(SEMAPHORE), 官方建议使用HystrixCommand
的时候用THREAD
策略(线程池中默认为10个线程),使用HystrixObservableCommand
的时候使用SEMAPHORE
策略。
项 | 值 |
---|---|
默认值 | THREAD |
可选值 | THREAD ,SEMAPHORE |
默认全局配置 | hystrix.command.default.execution.isolation.strategy |
实例配置 | hystrix.command.[HystrixCommandKey].execution.isolation.strategy |
配置文件中配置(Properties):
# 默认全局配置
hystrix.command.default.execution.isolation.strategy=THREAD
# 实例配置(等价于在@HystrixCommand注解中直接进行配置)
# 但是当使用Feign整合的方式时,只能采用这种方式进行配置
hystrix.command.[HystrixCommandKey].execution.isolation.strategy=THREAD
execution.timeout.enabled :是否开启超时检测, 只有设置为true的时候,下面提到的“超时时间上限”才会有效。
项 | 值 |
---|---|
默认值 | true |
可选值 | true ,false |
默认全局配置 | hystrix.command.default.execution.timeout.enabled |
实例配置 | hystrix.command.[HystrixCommandKey].execution.timeout.enabled |
建议(笔者备注) | 保持选用默认值 |
配置文件中配置(Properties):
# 默认全局配置
hystrix.command.default.execution.timeout.enabled=true
# 实例配置
hystrix.command.[HystrixCommandKey].execution.timeout.enabled=true
execution.isolation.thread.timeoutInMilliseconds:超时阈值,单位是毫秒。如果命令执行耗时超过此时间阈值,会进入到降级逻辑。 这个配置生效的前提是开启了超时检测功能。
项 | 值 |
---|---|
默认值 | 1000 |
可选值 | - |
默认全局配置 | hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds |
实例配置 | hystrix.command.[HystrixCommandKey].execution.isolation.thread.timeoutInMilliseconds |
配置文件中配置:
# 默认全局配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
# 实例配置
hystrix.command.[HystrixCommandKey].execution.isolation.thread.timeoutInMilliseconds=1000
execution.isolation.thread.interruptOnTimeout :超时是否中断,HystrixCommand执行超时的情况下是否中断。
项 | 值 |
---|---|
默认值 | true |
可选值 | true 、false |
默认全局配置 | hystrix.command.default.execution.isolation.thread.interruptOnTimeout |
实例配置 | hystrix.command.[HystrixCommandKey].execution.isolation.thread.interruptOnTimeout |
建议(笔者备注) | 保持选用默认值 |
配置文件中配置:
# 默认全局配置
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
# 实例配置
hystrix.command.[HystrixCommandKey].execution.isolation.thread.interruptOnTimeout=true
execution.isolation.thread.interruptOnFutureCancel :取消是否中断,HystrixCommand执行的时候取消调用的情况下是否中断。
项 | 值 |
---|---|
默认值 | false |
可选值 | true 、false |
默认全局配置 | hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel |
实例配置 | hystrix.command.[HystrixCommandKey].execution.isolation.thread.interruptOnFutureCancel |
建议(笔者备注) | 保持选用默认值 |
配置文件中配置:
# 默认全局配置
hystrix.command.default.execution.isolation.thread.interruptOnCancel=fasle
# 实例配置
hystrix.command.[HystrixCommandKey].execution.isolation.thread.interruptOnFutureCancel=fasle
execution.isolation.semaphore.maxConcurrentRequests :采用 SEMAPHORE 隔离策略下,并发请求数量的最高上限,为了防止服务崩溃,进入降级逻辑的阈值。
项 | 值 |
---|---|
默认值 | 10 |
可选值 | - |
默认全局配置 | hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests |
实例配置 | hystrix.command.[HystrixCommandKey].execution.isolation.semaphore.maxConcurrentRequests |
建议(笔者备注) | 必须根据实际情况设定此值 |
配置文件中配置:
# 默认全局配置
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=100
# 实例配置
hystrix.command.CustomCommand.execution.isolation.semaphore.maxConcurrentRequests=100
命令降级配置控制HystrixCommand#getFallback()
的执行逻辑,所有命令降级配置对策略ExecutionIsolationStrategy.THREAD
或者ExecutionIsolationStrategy.SEMAPHORE
都生效。
fallback.enabled:是否开启服务降级, 此属性控制当HystrixCommand
执行失败之后是否调用HystrixCommand#getFallback()
。
项 | 值 |
---|---|
默认值 | true |
可选值 | false 、true |
默认全局配置 | hystrix.command.default.fallback.enabled |
实例配置 | hystrix.command.[HystrixCommandKey].fallback.enabled |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.fallback.enabled=true
# 实例配置
hystrix.command.[HystrixCommandKey].fallback.enabled=true
fallback.isolation.semaphore.maxConcurrentRequests :最大降级请求并发处理上限,当降级方法的并发处理信号量达到此阈值时,不再执行降级逻辑并抛出一个异常。
项 | 值 |
---|---|
默认值 | 10 |
可选值 | - |
默认全局配置 | hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests |
实例配置 | hystrix.command.[HystrixCommandKey].fallback.isolation.semaphore.maxConcurrentRequests |
建议(笔者备注) | 必须根据实际情况设定此值 |
注意:要区别于execution.isolation.semaphore.maxConcurrentRequests,一个是在SEMAPHORE 隔离策略下,对正常逻辑的最大并发请求量;一个是请求失败后对降级逻辑的最大并发访问量,无论是哪一种隔离策略。
配置文件中配置:
# 默认全局配置
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=20
# 实例配置
hystrix.command.[HystrixCommandKey].fallback.isolation.semaphore.maxConcurrentRequests=20
circuitBreaker.enabled:是否启用断路器,启用之后,断路器会跟踪调用的健康状况,达到断路条件后切断请求链路。
项 | 值 |
---|---|
默认值 | true |
可选值 | false 、true |
默认全局配置 | hystrix.command.default.circuitBreaker.enabled |
实例配置 | hystrix.command.[HystrixCommandKey].circuitBreaker.enabled |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.circuitBreaker.enabled=true
# 实例配置
hystrix.command.[HystrixCommandKey].circuitBreaker.enabled=true
circuitBreaker.requestVolumeThreshold :断路请求量阈值, 此属性设置促使断路器打开的滑动窗口中的最小请求数量。 低于此值时,即使失败的比例达到了一定值也不会触发熔断。一般根据接口的QPS计算,建议设置为 QPS * 窗口秒数 * 60%。
滑动窗口的介绍见5.8.5
项 | 值 |
---|---|
默认值 | 20 |
可选值 | - |
默认全局配置 | hystrix.command.default.circuitBreaker.requestVolumeThreshold |
实例配置 | hystrix.command.[HystrixCommandKey].circuitBreaker.requestVolumeThreshold |
建议(笔者备注) | 建议保持默认值,如果部分接口不能容忍默认阈值可以单独配置 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.circuitBreaker.requestVolumeThreshold=10
# 实例配置
hystrix.command.CustomCommand.circuitBreaker.requestVolumeThreshold=10
circuitBreaker.sleepWindowInMilliseconds:断路器断路后的休眠时间,在此期间内所有的请求自动进入降级逻辑,期间过后熔断器进入半开状态,放行一个请求用来确定是否应该关闭断路器。
项 | 值 |
---|---|
默认值 | 5000 |
可选值 | - |
默认全局配置 | hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds |
实例配置 | hystrix.command.[HystrixCommandKey].circuitBreaker.sleepWindowInMilliseconds |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
# 实例配置
hystrix.command.[HystrixCommandKey].circuitBreaker.sleepWindowInMilliseconds=5000
circuitBreaker.errorThresholdPercentage :失败阈值百分比,用来设置一个错误百分比,在一个滑动窗口中,请求的数量超过requestVolumeThreshold,并且调用错误率超过设定值,断路器就会打开。
项 | 值 |
---|---|
默认值 | 50 |
可选值 | - |
默认全局配置 | hystrix.command.default.circuitBreaker.errorThresholdPercentage |
实例配置 | hystrix.command.[HystrixCommandKey].circuitBreaker.errorThresholdPercentage |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
# 实例配置
hystrix.command.[HystrixCommandKey].circuitBreaker.errorThresholdPercentage=50
circuitBreaker.forceOpen :是否强制打开断路器, 强制打开断路器会使所有请求直接进入降级逻辑
circuitBreaker.forceClosed :是否强制关闭断路器, 强制关闭断路器会导致所有和断路器相关的配置和功能都失效,所有失败的请求都进入降级逻辑。两个属性互斥,不能同时开启,但是都没有什么应用场景,一般都是false。
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.circuitBreaker.forceOpen=false
hystrix.command.default.circuitBreaker.forceClosed=false
# 实例配置
hystrix.command.[HystrixCommandKey].circuitBreaker.forceOpen=false
hystrix.command.[HystrixCommandKey].circuitBreaker.forceClosed=false
度量统计配置是对HystrixCommand或者HystrixObservableCommand执行时候的统计数据收集动作生效。
统计得来的数据将直接影响服务降级、服务熔断等功能。
metrics.rollingStats.timeInMilliseconds :滑动窗口持续时间,Hystrix执行统计操作的时间单位,比如requestVolumeThreshold就是建立在此基础之上的。
项 | 值 |
---|---|
默认值 | 10000 |
可选值 | - |
默认全局配置 | hystrix.command.default.metrics.rollingStats.timeInMilliseconds |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.rollingStats.timeInMilliseconds |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
# 实例配置
hystrix.command.[HystrixCommandKey].metrics.rollingStats.timeInMilliseconds=10000
**metrics.rollingStats.numBuckets**:滑动窗口Bucket总数,将滑动窗口分成若干份。
项 | 值 |
---|---|
默认值 | 10 |
可选值 | 必须能够整除timeInMilliseconds,并且要尽量小,否则有可能影响性能 |
默认全局配置 | hystrix.command.default.metrics.rollingStats.numBuckets |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.rollingStats.numBuckets |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.rollingStats.numBuckets=10
# 实例配置
hystrix.command.[HystrixCommandKey].metrics.rollingStats.numBuckets=10
metrics.rollingPercentile.enabled :是否启用百分数计算
项 | 值 |
---|---|
默认值 | true |
可选值 | true 、false |
默认全局配置 | hystrix.command.default.metrics.rollingPercentile.enabled |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.enabled |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.rollingPercentile.enabled=true
# 实例配置
hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.enabled=true
**metrics.rollingPercentile.timeInMilliseconds**:百分数计算使用的滑动窗口持续时间
项 | 值 |
---|---|
默认值 | 60000 |
可选值 | - |
默认全局配置 | hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.timeInMilliseconds |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds=60000
# 实例配置
hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.timeInMilliseconds=60000
metrics.rollingPercentile.numBuckets:百分数计算使用的滑动窗口Bucket总数
项 | 值 |
---|---|
默认值 | 6 |
可选值 | 必须能够整除timeInMilliseconds,并且要尽量小,否则有可能影响性能 |
默认全局配置 | hystrix.command.default.metrics.rollingPercentile.numBuckets |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.numBuckets |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.rollingPercentile.numBuckets=6
# 实例配置
hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.numBuckets=6
metrics.rollingPercentile.bucketSize :百分数计算使用的Bucket容量
项 | 值 |
---|---|
默认值 | 100 |
可选值 | - |
默认全局配置 | hystrix.command.default.metrics.rollingPercentile.bucketSize |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.bucketSize |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.rollingPercentile.bucketSize=100
# 实例配置
hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.bucketSize=100
metrics.healthSnapshot.intervalInMilliseconds :健康状态快照收集的周期
项 | 值 |
---|---|
默认值 | 500 |
可选值 | - |
默认全局配置 | hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds |
实例配置 | hystrix.command.[HystrixCommandKey].metrics.healthSnapshot.intervalInMilliseconds |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=500
# 实例配置
hystrix.command.CustomCommand.metrics.healthSnapshot.intervalInMilliseconds=500
请求上下文配置主要涉及到HystrixRequestContext
和HystrixCommand
的使用配置。
requestCache.enabled:是否启用请求缓存
项 | 值 |
---|---|
默认值 | true |
可选值 | true 、false |
默认全局配置 | hystrix.command.default.requestCache.enabled |
实例配置 | hystrix.command.[HystrixCommandKey].requestCache.enabled |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.requestCache.enabled=true
# 实例配置
hystrix.command.[HystrixCommandKey].requestCache.enabled=true
requestLog.enabled :是否启用请求日志
项 | 值 |
---|---|
默认值 | true |
可选值 | true 、false |
默认全局配置 | hystrix.command.default.requestLog.enabled |
实例配置 | hystrix.command.[HystrixCommandKey].requestLog.enabled |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.command.default.requestLog.enabled=true
# 实例配置
hystrix.command.[HystrixCommandKey].requestLog.enabled=true
请求合成器配置主要控制HystrixCollapser
的行为,即用来设置Hystrix合并请求的行为。
maxRequestsInBatch:一批请求中最大的请求数
项 | 值 |
---|---|
默认值 | Integer.MAX_VALUE |
可选值 | - |
默认全局配置 | hystrix.collapser.default.maxRequestsInBatch |
实例配置 | hystrix.collapser.[HystrixCollapserKey].maxRequestsInBatch |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.collapser.default.maxRequestsInBatch=10
# 实例配置
# 因为批处理操作针对的是同一个Hystrix命令,HystrixCommandKey相同且唯一
# [HystrixCollapserKey]=[HystrixCommandKey]Collapser
hystrix.collapser.[HystrixCollapserKey].maxRequestsInBatch=10
timerDelayInMilliseconds :延迟执行时间
项 | 值 |
---|---|
默认值 | 10 |
可选值 | - |
默认全局配置 | hystrix.collapser.default.timerDelayInMilliseconds |
实例配置 | hystrix.collapser.[HystrixCollapserKey].timerDelayInMilliseconds |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.collapser.default.timerDelayInMilliseconds=10
# 实例配置
hystrix.collapser.[HystrixCollapserKey].timerDelayInMilliseconds=10
requestCache.enabled :是否启用合成请求缓存
项 | 值 |
---|---|
默认值 | true |
可选值 | true 、false |
默认全局配置 | hystrix.collapser.default.requestCache.enabled |
实例配置 | hystrix.collapser.[HystrixCollapserKey].requestCache.enabled |
建议(笔者备注) | 建议保持默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.collapser.default.requestCache.enabled=true
# 实例配置
hystrix.collapser.CustomHystrixCollapser.requestCache.enabled=true
Hystrix
使用的是JUC线程池ThreadPoolExecutor
,线程池相关配置直接影响ThreadPoolExecutor
实例。Hystrix
的命令执行选用了线程池策略,那么就是通过线程池隔离执行的,最好为每一个分组设立独立的线程池。笔者在生产实践的时候,一般把HystrixCommandGroupKey
和HystrixThreadPoolKey
设置为一致。
coreSize :核心线程数
项 | 值 |
---|---|
默认值 | 10 |
可选值 | - |
默认全局配置 | hystrix.threadpool.default.coreSize |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].coreSize |
建议(笔者备注) | 根据真实情况自行配置和调整 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.coreSize=10
# 实例配置
hystrix.threadpool.CustomCommand.coreSize=10
maximumSize :最大线程数, 此属性只有在allowMaximumSizeToDivergeFromCoreSize
为true
的时候才生效。
项 | 值 |
---|---|
默认值 | 10 |
可选值 | - |
默认全局配置 | hystrix.threadpool.default.maximumSize |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].maximumSize |
建议(笔者备注) | 根据真实情况自行配置和调整 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.maximumSize=10
# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].maximumSize=10
allowMaximumSizeToDivergeFromCoreSize :是否允许最大线程数和核心线程数不同
项 | 值 |
---|---|
默认值 | false |
可选值 | true 、false |
默认全局配置 | hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].allowMaximumSizeToDivergeFromCoreSize |
建议(笔者备注) | 根据真实情况自行配置和调整 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=true
# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].allowMaximumSizeToDivergeFromCoreSize=true
keepAliveTimeMinutes:非核心线程存活时间, 当allowMaximumSizeToDivergeFromCoreSize
为true
并且maximumSize
大于coreSize
时此配置才生效。
项 | 值 |
---|---|
默认值 | 1 |
可选值 | 大于0的整数 |
默认全局配置 | hystrix.threadpool.default.keepAliveTimeMinutes |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].keepAliveTimeMinutes |
建议(笔者备注) | 根据真实情况自行配置和调整 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.keepAliveTimeMinutes=1
# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].keepAliveTimeMinutes=1
maxQueueSize :最大任务队列容量, 此属性配置为-1时使用的是SynchronousQueue
,配置为大于1的整数时使用的是LinkedBlockingQueue
。
项 | 值 |
---|---|
默认值 | -1 |
可选值 | -1 或者大于0的整数 |
默认全局配置 | hystrix.threadpool.default.maxQueueSize |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].maxQueueSize |
建议(笔者备注) | 根据真实情况自行配置和调整 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.maxQueueSize=-1
# 实例配置
hystrix.threadpool.CustomCommand.maxQueueSize=-1
queueSizeRejectionThreshold :任务队列的阈值, 当maxQueueSize
配置为-1的时候,此配置项不生效。
项 | 值 |
---|---|
默认值 | 5 |
可选值 | 大于0的整数 |
默认全局配置 | hystrix.threadpool.default.queueSizeRejectionThreshold |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].queueSizeRejectionThreshold |
建议(笔者备注) | 根据真实情况自行配置和调整 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.queueSizeRejectionThreshold=5
# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].queueSizeRejectionThreshold=5
metrics.rollingStats.timeInMilliseconds :线程池滑动窗口持续时间
项 | 值 |
---|---|
默认值 | 10000 |
可选值 | - |
默认全局配置 | hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].metrics.rollingStats.timeInMilliseconds |
建议(笔者备注) | 建议使用默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=10000
# 实例配置
hystrix.threadpool.CustomCommand.metrics.rollingStats.timeInMilliseconds=10000
metrics.rollingStats.numBuckets :线程池滑动窗口Bucket总数
项 | 值 |
---|---|
默认值 | 10 |
可选值 | 满足metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0 ,值要尽量少,否则会影响性能 |
默认全局配置 | hystrix.threadpool.default.metrics.rollingStats.numBuckets |
实例配置 | hystrix.threadpool.[HystrixThreadPoolKey].metrics.rollingStats.numBuckets |
建议(笔者备注) | 建议使用默认值 |
配置文件中(Properties)配置:
# 默认全局配置
hystrix.threadpool.default.metrics.rollingStats.numBuckets=10
# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].metrics.rollingStats.numBuckets=10
步骤 | 详情 |
---|---|
1 | 创建HystrixCommand对象(用于返回单一结果对象)或者HystrixObservableCommand对象(用于返回多个结果对象),一切都是从创建这个对象开始的,相当于对原接口方法的封装 |
2 | 命令执行。其中HystrixCommand有两种执行方式,一种是execute(),同步执行,从依赖的服务中返回单一结果的对象,错误的时候抛出异常。另一种是queue(),异步执行,直接返回一个Future对象,其中包含了服务的执行结束时要返回的结果对象。HystrixObservableCommand用的比较少,执行方式不再说明。一般情况下使用的是execute(),无论哪一种执行方式,执行的步骤都是3–9 |
3 | 判断当前命令的缓存功能是否被启用,如果缓存中有结果,则直接返回,否则进行第4步。 |
4 | 判断断路器是否为打开状态,如果断路器打开,则主逻辑不再执行,进入降级逻辑,进入第8步;如果断路器是关闭的,则进入第5步 |
5 | 判断线程池+请求队列/信号量是否打满。打满则执行降级逻辑,进入第8步;如果没满,则进入请求队列,或者进入第6步 |
6 | Hystrix根据我们书写的方法决定采用什么样的方式去请求依赖服务,HystrixCommand.run():返回单一的结果对象,或者抛出异常。HystrixObservableCommand.construct():返回多个结果 |
7 | run()或者construct()执行,在执行过程中判断是否发生了异常,如果异常,进入第8步;否则判断是否执行超时,如果超时,进入第8步;否则进入第9步。并且在此期间,Hystrix会将“成功”、“失败”、“拒绝”、“超时”等信息报告给断路器,而断路器会维护一组数据来统计这些数据,并使用这些数据来决定是否打开断路器。 |
8 | 当第2步的方法执行失败时,Hystrix为了防止上游服务崩溃并且给上游一个友好的返回,会进入fallback降级逻辑。会导致第2步方法失败的情况有一下几种:断路器打开、资源不足(线程池线程池+请求队列/信号量打满)、run方法抛出异常或者执行超时。 |
9 | 当第2步的Hystrix命令执行成功后,它会将处理结果直接返回或者以Observable的形式返回。 |
除了隔离依赖服务的调用之外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续的记录所有通过Hystrix发起的服务调用的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求,其中多少成功,多少失败等。NetFlix通过hystrix-metrics-event-stream项目实现了对以上指标的监控,SpringCloud也提供了Hystrix Dashboard的整合,将监控内容转化为可视化界面。
具体的配置方式此处不再详述,可参见大神文章:
https://www.hangge.com/blog/cache/detail_2742.html,单个应用监控
https://www.hangge.com/blog/cache/detail_2743.html,集群监控