openFeign先要开启 hystrix 的请求:
# 开启服务熔断
feign.hystrix.enabled=true
主要命令有2个:
主要流程如下:调用方在发出请求 —> 监测(observe)该请求 --> 查看cache response 是否存在(存在就直接返回) —> 查看断路器 circuit-breaker 是否开启(若开启直接短路请求尝试返回fallback) --> 检测ThreadPool的队列是否已经开始拒绝请求(即线程池的等待队列已满且线程池中达到最大线程数,若已经开始拒绝请求尝试返回fallback) --> 构建 Command 执行。
hystrix的相关配置有4个级别:
default
关键字的属性(推荐);hystrix.command.HystrixCommandKey.execution.isolation.strategy
;注: 代码中实例属性示例:
HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(int value)
public HystrixCommandInstance(int id) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(500)));
this.id = id;
}
public HystrixCommandInstance(int id) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"), 500);
this.id = id;
}
以下均为hystrix默认使用的属性,如果不配置该属性,也可以直接动态配置实例属性,即将属性中的default
换成HystrixCommandKey
即可,如默认属性为 hystrix.command.default.execution.isolation.strategy
,那它对应的实例属性就为hystrix.command.HystrixCommandKey.execution.isolation.strategy
,其他属性类似。
# thread 通过线程数量来限制并发请求数,可以提供额外的保护,但有一定的延迟。一般用于网络调用
# semaphore 通过semaphore count来限制并发请求数,适用于无网络的高并发请求
# 默认隔离策略,默认是Thread, 可选 THREAD(推荐,在调用线程之外的另一个线程上单独执行,并发量受限于线程池)|SEMAPHORE (在调用线程上执行,并发请求受到信号量的限制)
hystrix.command.default.execution.isolation.strategy=THREAD
# 定义hystrix是否开启超时配置,默认为true
hystrix.command.HystrixCommandKey.execution.timeout.enabled=true
# 定义hystrix是否允许在超时时允许被打断,默认为true
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
# 定义hystrix是否响应取消操作,默认为false(即hystrix command 在执行时是否可以执行取消行为)
hystrix.command.default.execution.isolation.thread.interruptOnCanc=false
# 默认调用线程的超时时间(调用方会一直观察该请求直至获取结果或到超时),默认缺省为1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
# 定义在使用 ExecutionIsolationStrategy.SEMAPHORE 隔离策略时最大允许并发运行的hystrix command命令数(超出的直接丢弃),默认为10
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=10
# 定义是否在请求失败或被丢弃时尝试去调用getFallback()方法,默认为true
hystrix.command.default.fallback.enabled=true
# 定义某个调用线程调用hystrixCommand.getFallback()的最大次数,默认为10
# 若达到最大并发请求数,后面的请求将直接被丢弃,此时不会取回定义的fallback
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=10
断路器的工作流程如下:
断路器的各个属性配置如下:
# 定义是否使用断路器去做断路器的健康检测以及在短路请求时进行跳闸,默认为true
# 这里的健康检测特指hystrix断路器的健康,即检测断路器的开、闭状态
hystrix.command.default.circuitBreaker.enabled=true
# 定义在一个滚动窗口中触发断路器的最小请求数(阈值),默认为20
hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
# 定义触发断路器开启的失败请求百分比,默认50,即50%
# X%的请求都失败了就会触发回路短路,此时尝试返回fallback逻辑
hystrix.command.default.circuitBreaker.errorThresholdPercentag=50
# 定义电路跳闸后拒绝请求的时间,然后允许再次尝试确定电路是否应再次闭合,默认为5000ms
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
# 定义断路器的强制开启状态,默认为false
# 如果为true,它将迫使断路器进入断开(跳闸)状态,在该状态下断路器将拒绝所有请求
hystrix.command.default.circuitBreaker.forceOpen=false
# 定义断路器的强制关闭状态,默认为false
# 如果为true,它将迫使断路器进入关闭状态,在该状态下断路器将接受所有请求(无论失败请求是否达到触发短路的百分比)
hystrix.command.default.circuitBreaker.forceClosed=false
主要是计算hystrixCommand和HystrixObservableCommand(调用方在请求后会检测请求结果)指标。
# 定义统计滚动窗口的持续时间(毫秒),这时间是Hystrix保留断路器使用和发布指标的时间
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
# 定义滚动统计窗口分为的存储桶数,默认为10
# 注: metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0 (否则会抛异常)
hystrix.command.default.metrics.rollingStats.numBuckets=10
# 定义是否跟踪执行延迟并将其计算为百分数,默认为true
# 若禁用,则所有摘要统计信息(平均值,百分位数)都返回-1
hystrix.command.default.metrics.rollingPercentile.enabled=true
# 定义滚动窗口的持续时间,在该持续时间中保留执行时间进行百分比计算,默认为60000ms
hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds=60000
# 定义 rollingPercentile 窗口分割成的桶数,默认为6
# 注:metrics.rollingPercentile.timeInMilliseconds % metrics.rollingPercentile.numBuckets == 0 (否则会抛异常)
hystrix.command.default.metrics.rollingPercentile.numBuckets=6
# 定义每个存储区保留的最大执行时间,如果在这段时间内发生了更多的执行超出了桶的容量,它们将覆盖存储桶的头部内容
# 如果存储桶大小设置为100,并且表示10秒的存储桶窗口,但10s内发生了500次执行,则在该10秒存储桶中将仅保留最近的100次执行
# 加大这个属性值将会需要更多的内存存储以及更多的时间进行排序
hystrix.command.default.metrics.rollingPercentile.bucketSize=100
# 定义允许进行运行状况快照之间的等待时间(毫秒),该运行状况快照可计算成功率和错误率百分比并影响断路器状态
hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=500
# 定义HystrixCommand.getCacheKey()是否应与HystrixRequestCache一起使用
# 这样可以通过请求范围的缓存提供重复数据删除功能,默认为true
hystrix.command.default.requestCache.enabled=true
# 定义是否将HystrixCommand的执行和事件记录到HystrixRequestLog,默认为true
hystrix.command.default.requestLog.enabled=true
request collapser 是 hystrix 提供批量请求的合并,及多个Command.execute()/queue()
合并成一个 Collapser 然后获取线程池中的一个线程去执行,而不是像通常的一个Command.execute()/queue()
就各自占用一个线程去执行,这样可以节省网络带宽和减少线程消耗。
控制HystrixCollapser的行为,以下均为hystrix Collapser 默认使用的属性。如果不配置该属性,需要配置实例属性,即将属性中的default
换成HystrixCollapserKey
即可,如默认属性为 hystrix.collapser.default.maxRequestsInBatch
,那它对应的实例属性就为hystrix.collapser.HystrixCollapserKey.maxRequestsInBatch
,其他属性类似。
# 定义在触发批量请求时允许的最大请求数,默认值 Integer.MAX_VALUE
hystrix.collapser.default.maxRequestsInBatch=Integer.MAX_VALUE
# 定义在创建批量请求触发时执行的毫秒数
hystrix.collapser.default.timerDelayInMilliseconds=10
# 设置是否为HystrixCollapser.execute()和HystrixCollapser.queue()调用启用请求缓存,默认为true
hystrix.collapser.default.requestCache.enabled=true
控制Hystrix的ThreadPool属性,hystrix线程池相关概念和Java中的线程池保持一致:核心线程数、最大线程数、队列长度等。以下均为hystrix默认使用的属性,如果不配置该属性,需要配置实例属性,即将属性中的default
换成HystrixThreadPoolProperties
即可,如 默认属性为 hystrix.threadpool.default.coreSize=10
,那它对应的实例属性就为hystrix.threadpool.HystrixThreadPoolProperties.coreSize=10
,其他属性类似。
# 定义线程池的核心线程数,默认10,它可以处理99%的请求,健康状态下,线程池中通常只有一两个存活的线程去服务40ms的调用
# 该数值若要调大,应匹配公式:健康时每秒请求数的峰值 * 99%的延迟(以秒为单位)+一些缓冲数值(可以适度定义)
# 上述公式的是让线程池尽可能的小,因为线程池是减轻负载并防止资源发生延迟的主要手段
# 当该属性正确配置时,HystrixCommand超时现象应该是极少的,但是还是需要有保护措施来减少网络延迟的影响,尤其是在最坏的情况下,connect + read + retry + connect + read的组合仍会超过配置的总体超时
hystrix.threadpool.default.coreSize=10
# 定义等待队列的容量,若设为-1则使用SynchronousQueue队列,若为正数则使用LinkedBlockingQueue队列并设置为它的容量
# 注:队列容量在初始化后就不能进行resize了,若期望动态控制队列长度,需要配置 queueSizeRejectionThreshold 属性
hystrix.threadpool.default.maxQueueSize=-1
# 定义拒绝队列的阈值,默认为5,人为设置的最大队列长度,即使尚未达到 maxQueueSize,也会拒绝请求
# 该属性是为了解决BlockingQueue不能动态resize的问题,所以只有hystrix.threadpool.default.maxQueueSize属性为正值时才生效
hystrix.threadpool.default.queueSizeRejectionThreshold=5
# 定义线程池中线程的存活时间(分钟),默认为1
hystrix.threadpool.default.keepAliveTimeMinutes=1
# 定义是否启用 maximumSize 属性,默认为false
hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=false
# 定义线程池的最大线程数,该数值可以大于等于核心线程数,如果该值大于核心线程数时可以维持 maximumSize 的并发,但在不活跃期间可以返回线程,默认为10
# 该参数只有同时配置了 allowMaximumSizeToDivergeFromCoreSize=true参数才会生效
hystrix.threadpool.default.maximumSize=10
# 定义统计滚动窗口的持续时间(毫秒),默认为10000
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=10000
# 定义滚动统计窗口划分为的桶数,默认为10
# 注:必须满足条件 metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0,否则会抛异常
hystrix.threadpool.default.metrics.rollingStats.numBuckets=10