Spring Cloud 核心组件 Hystrix

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:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值