Hystrix原理和配置说明

本文深入探讨了 Hystrix 中的服务熔断和服务降级机制,包括断路器的工作原理、配置参数及其在微服务架构中的应用。同时介绍了 Hystrix 的线程池隔离和信号量隔离策略。

在微服务场景下,服务间调用链路加长,有时候一个部分出现问题可能会引起整个链路的崩溃,为此微服务中提出了如下两个概念:

  • 服务熔断
  • 服务降级
服务熔断

熔断来源于电路中断路器的概念,服务熔断指的是 当下游服务因为某种原因不可用或响应慢时,上游服务为了保证自己整体服务的可用性,不在调用下游服务而是直接返回,快速释放资源,直到下游服务恢复才继续调用

服务降级

当服务器压力剧增的时候,根据当前业务情况以及流量,对一些服务和页面有策略的降级,以此缓解服务器资源的压力以保障核心任务的正常运行,同时也保证了大部分客户能得到正常的响应。

服务熔断一般是针对调用的下游服务,而降级一般是从系统的整体考虑的

从官网找的Hystrix工作流图:
在这里插入图片描述
整体执行流程如下:

  1. 构造一个 HystrixCommandHystrixObservableCommand
  2. 执行上面构造的command,会涉及到如下四个方法:
K             value   = command.execute();
Future<K>     fValue  = command.queue();
Observable<K> ohValue = command.observe();         //hot observable
Observable<K> ocValue = command.toObservable();    //cold observable
  1. 如果调用允许缓存,判断请求的响应是否有缓存,如果有缓存,直接返回缓存内容
  2. 判断断路器是否打开,如果断路器打开那么执行步骤8,断路器没有打开,执行步骤5
  3. 如果线程池和队列或者信号量是否已经满了,如果已经满了,执行步骤8,没有达到阈值执行步骤6
  4. 执行HystrixObservableCommand.construct()HystrixCommand.run()
  5. 统计计算断路器的状态,Hystrix会将请求的结果:成功、失败、拒绝、超时信息汇报给断路器,断路器根据这些信息是否打开断路器或关闭断路器
  6. 当command执行失败的时候,执行Fallback
  7. 当command执行成功,返回相应给调用者

断路器逻辑:
在这里插入图片描述

Hystrix是Netflix实现的服务限流、降级功能,可以完成隔离、限流、熔断、降级这些常用保护功能。Hystrix的隔离主要是基于线程隔离或者信号量隔离来实现的,服务隔离保证了不同服务之间的调用不会受其他服务影响。Hystrix的执行都是基于线程池异步调度执行的,而在方法调用上,同步方法实际也是异步执行的,只不过同步方法会阻塞等待,直到方法完成才返回。

基于Spring框架下,Hystrix基于AOP实现对方法的切面代理HystrixCommandAspect,获取方法是否有HystrixCollapserHystrixCommand注解,如果方法上有这两个注解的话,那么Hystrix将在实际方法执行前执行Hystrix的逻辑。
Hystrix中通过HystrixCircuitBreaker来定义了断路器的相关逻辑,主要有两个实现:

  • NoOpCircuitBreaker 不进行任何处理
  • HystrixCircuitBreakerImpl Hystrix默认断路器实现

HystrixCircuitBreakerImpl主要就是基于HystrixCommandMetrics统计信息来设置当前断路器的状态:

class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {
   
   
        private final HystrixCommandProperties properties;
        private final HystrixCommandMetrics metrics;
        private AtomicBoolean circuitOpen = new AtomicBoolean(false);
        private AtomicLong circuitOpenedOrLastTestedTime = new AtomicLong();

        protected HystrixCircuitBreakerImpl(HystrixCommandKey key, HystrixCommandGroupKey commandGroup, HystrixCommandProperties properties, HystrixCommandMetrics metrics) {
   
   
            this.properties = properties;
            this.metrics = metrics;
        }

        public void markSuccess() {
   
   
            if (circuitOpen.get()) {
   
   
                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值