Spring Cloud 核心组件 Hystrix
- 作者:DecaMinCow
- 博客:http://blog.csdn.net/m0_37567301
- 邮箱:decamincow#gmail.com (#->@)
Hystrix 能解决什么问题
是由Netflix开源的一个延迟和容错库
- 包裹请求:使用HystrixCommand包裹对依赖的调用逻辑。
- 跳闸机制:当某服务的错误率超过一定的阈值时,Hystrix可以跳闸,停止请求该服务一段时间。
- 资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(舱壁模式)(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等待,从而加速失败判定。
- 监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
- 回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供,例如返回一个缺省值。
- 自我修复:断路器打开一段时间后,会自动进入“半开”状态。
雪崩效应解决方案
- 服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。我们在各种场景下都会接触到熔断这两个字。高
压电路中,如果某个地方的电压过高,熔断器就会熔断,对电路进行保护。股票交易中,如果股票指数
过高,也会采用熔断机制,暂停股票的交易。同样,在微服务架构中,熔断机制也是起着类似的作用。
当扇出链路的某个微服务不可用或者响应时间太⻓时,熔断该节点微服务的调用,进行服务的降级,快
速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
注意:
1)服务熔断重点在“断”,切断对下游服务的调用 2)服务熔断和服务降级往往是一起使用的,Hystrix就是这样。
- 服务降级
通俗讲就是整体资源不够用了,先将一些不关紧的服务停掉(调用我的时候,给你返回一个预留的值, 也叫做兜底数据),待渡过难关高峰过去,再把那些服务打开。
服务降级一般是从整体考虑,就是当某个服务熔断之后,服务器将不再被调用,此刻客户端可以自己准 备一个本地的fallback回调,返回一个缺省值,这样做,虽然服务水平下降,但好歹可用,比直接挂掉 要强。
- 服务限流
服务降级是当服务出问题或者影响到核心流程的性能时,暂时将服务屏蔽掉,待高峰或者问题解决后再 打开;但是有些场景并不能用服务降级来解决,比如秒杀业务这样的核心功能,这个时候可以结合服务 限流来限制这些场景的并发/请求量
限流措施也很多,比如
限制总并发数(比如数据库连接池、线程池)
限制瞬时并发数(如nginx限制瞬时并发连接数) 限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速 率)
限制远程接口调用速率、限制MQ的消费速率等
Hystrix舱壁模式(线程池隔离策略)
如果不进行任何设置,所有熔断方法使用一个Hystrix线程池(10个线程),那么这样的话会导致问 题,这个问题并不是扇出链路微服务不可用导致的,而是我们的线程机制导致的,如果方法A的请求把 10个线程都用了,方法2请求处理的时候压根都没法去访问B,因为没有线程可用,并不是B服务不可用。
为了避免问题服务请求过多导致正常服务无法访问,Hystrix 不是采用增加线程数,而是单独的为每一 个控制方法创建一个线程池的方式,这种模式叫做“舱壁模式",也是线程隔离的手段。
Hystrix工作流程与高级应用
/**
* 8秒钟内,请求次数达到2个,并且失败率在50%以上,就跳闸 * 跳闸后活动窗口设置为3s
*/
@HystrixCommand(
commandProperties = {
@HystrixProperty(name =
"metrics.rollingStats.timeInMilliseconds",value = "8000"),
@HystrixProperty(name =
"circuitBreaker.requestVolumeThreshold",value = "2"),
@HystrixProperty(name =
"circuitBreaker.errorThresholdPercentage",value = "50"),
@HystrixProperty(name =
"circuitBreaker.sleepWindowInMilliseconds",value = "3000")
} )
或者
# 配置熔断策略: hystrix:
command:
default:
circuitBreaker:
# 强制打开熔断器,如果该属性设置为true,强制断路器进入打开状态,将会拒绝所有的请
求。 默认false关闭的
forceOpen: false
# 触发熔断错误比例阈值,默认值50%
errorThresholdPercentage: 50
# 熔断后休眠时⻓,默认值5秒
sleepWindowInMilliseconds: 3000
# 熔断触发最小请求次数,默认值是20
requestVolumeThreshold: 2
execution:
isolation:
thread:
# 熔断超时设置,默认为1秒
timeoutInMilliseconds: 2000
基于springboot的健康检查观察跳闸状态(自动投递微服务暴露健康检查细节)
# springboot中暴露健康检查等断点接口 management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的细节 endpoint:
health: