SpringCloud--Hystrix--断路器--02

接上一篇:SpringCloud–Hystrix–断路器–01

9、Hystrix的完整配置列表

​ 为了更好的使用Hystrix,此处将Hystrix的完整配置进行说明。在Hystrix中,一切的起源都是HystrixCommand或者HystrixObservableCommand,此处主要针对HystrixCommand,主要包括标识(key)配置,命令执行(execution)配置、命令降级(fallback)配置、熔断器(circuit breaker)配置、度量统计(metrics)配置和请求上下文配置。
配置的方式可以可以分为注解配置和配置文件配置,注解配置主要是在@HystrixCommand(单个Command配置)和@DefaultProperties(Command group配置),配置文件方式配置既可以进行单个Command配置,也可以根据Command group进行配置,还可以针对当前服务的所有Command group进行配置。当当前服务只有一个服务接口类的时候,根据Command group进行配置等价于全局配置。

9.1、标识配置(key)

HystrixCommandKey:在Hystrix中,每一个HystrixCommand都有一个唯一的标识,是必须项,如果不配置,默认值是@HystrixCommand标注的方法名,即每个方法会被当做一个HystrixCommand。

​ 注意:大部分的Hystrix配置都是和HystrixCommandKey绑定的。

HystrixCommandGroupKey:在Hystrix中,将所有的HystrixCommand分组,每一个组的唯一标识叫做GroupKey。分组之后便于统计展示于仪表盘、上传报告和预警等等,也就是说,HystrixCommandGroupKey是Hystrix内部进行度量统计时候的分组标识,数据上报和统计的最小维度就是分组的KEY 。必须项,如果不进行配置,默认值是使用@HystrixCommand标注的方法所在的类名 。

HystrixThreadPoolKey:在Hystrix中,每一组Hystrix命令的执行都有一个独立的线程池,此线程池的唯一标识就叫做HystrixThreadPoolKey,必须项,如果不进行配置,会使用默认使用HystrixCommandGroupKey。

9.2、命令执行配置(execution)

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
可选值 truefalse
默认全局配置 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
可选值 truefalse
默认全局配置 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

9.3、命令降级配置(fallback)

​ 命令降级配置控制HystrixCommand#getFallback()的执行逻辑,所有命令降级配置对策略ExecutionIsolationStrategy.THREAD或者ExecutionIsolationStrategy.SEMAPHORE都生效。

fallback.enabled:是否开启服务降级, 此属性控制当HystrixCommand执行失败之后是否调用HystrixCommand#getFallback()

默认值 true
可选值 falsetrue
默认全局配置 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

9.4、断路器配置(circuit breaker)

circuitBreaker.enabled:是否启用断路器,启用之后,断路器会跟踪调用的健康状况,达到断路条件后切断请求链路。

默认值 true
可选值 falsetrue
默认全局配置 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

9.5、度量统计配置(metrics)

​ 度量统计配置是对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
可选值 truefalse
默认全局配置 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

9.6、请求上下文配置

​ 请求上下文配置主要涉及到HystrixRequestContextHystrixCommand的使用配置。

requestCache.enabled:是否启用请求缓存

默认值 true
可选值 truefalse
默认全局配置 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
可选值 truefalse
默认全局配置 hystrix.command.default.requestLog.enabled
实例配置 hystrix.command.[HystrixCommandKey].requestLog.enabled
建议(笔者备注) 建议保持默认值

配置文件中(Properties)配置:

# 默认全局配置
hystrix.command.default.requestLog.enabled=true

# 实例配置
hystrix.command.[HystrixCommandKey].requestLog.enabled=true

9.7、请求合成器配置

​ 请求合成器配置主要控制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
可选值 truefalse
默认全局配置 hystrix.collapser.default.requestCache.enabled
实例配置 hystrix.collapser.[HystrixCollapserKey].requestCache.enabled
建议(笔者备注) 建议保持默认值

配置文件中(Properties)配置:

# 默认全局配置
hystrix.collapser.default.requestCache.enabled=true

# 实例配置
hystrix.collapser.CustomHystrixCollapser.requestCache.enabled=true

9.8、线程池配置

Hystrix使用的是JUC线程池ThreadPoolExecutor,线程池相关配置直接影响ThreadPoolExecutor实例。Hystrix的命令执行选用了线程池策略,那么就是通过线程池隔离执行的,最好为每一个分组设立独立的线程池。笔者在生产实践的时候,一般把HystrixCommandGroupKeyHystrixThreadPoolKey设置为一致。

coreSize :核心线程数

默认值 10
可选值 -
默认全局配置 hystrix.threadpool.default.coreSize
实例配置 hystrix.threadpool.[HystrixThreadPoolKey].coreSize
建议(笔者备注) 根据真实情况自行配置和调整

配置文件中(Properties)配置:

# 默认全局配置
hystrix.threadpool.default.coreSize=10

# 实例配置
hystrix.threadpool.CustomCommand.coreSize=10

maximumSize :最大线程数, 此属性只有在allowMaximumSizeToDivergeFromCoreSizetrue的时候才生效。

默认值 10
可选值 -
默认全局配置 hystrix.threadpool.default.maximumSize
实例配置 hystrix.threadpool.[HystrixThreadPoolKey].maximumSize
建议(笔者备注) 根据真实情况自行配置和调整

配置文件中(Properties)配置:

# 默认全局配置
hystrix.threadpool.default.maximumSize=10

# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].maximumSize=10

allowMaximumSizeToDivergeFromCoreSize :是否允许最大线程数和核心线程数不同

默认值 false
可选值 truefalse
默认全局配置 hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize
实例配置 hystrix.threadpool.[HystrixThreadPoolKey].allowMaximumSizeToDivergeFromCoreSize
建议(笔者备注) 根据真实情况自行配置和调整

配置文件中(Properties)配置:

# 默认全局配置
hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=true

# 实例配置
hystrix.threadpool.[HystrixThreadPoolKey].allowMaximumSizeToDivergeFromCoreSize=true

keepAliveTimeMinutes:非核心线程存活时间, 当allowMaximumSizeToDivergeFromCoreSizetrue并且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

10、Hystrix的完成工作流程

​ 话不多说,先上一张Hystrix的官方流程图:
SpringCloud--Hystrix--断路器--02_第1张图片

步骤 详情
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的形式返回。

11、Hystrix的调用监控

​ 除了隔离依赖服务的调用之外,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,集群监控

你可能感兴趣的:(分布式,SpringCloud,微服务)