分布式进阶(二九)——分布式框架之高可用:Hystrix熔断

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

Hystrix熔断,其实就是打开了断路器(Circuit Breaker)。Hystrix在运行过程中会向每个commandKey对应的断路器报告 成功、失败、超时 和 拒绝 的状态,断路器会统计并维护这些数据,根据这些统计信息来确定断路器的状态: 打开(open) 、 半开(half-open) 、 关闭(close) 。

  • 打开状态:后续的请求都会被截断,直接走fallback降级;
  • 半开状态:默认每隔5s,尝试半开,放入一部分流量进来,相当于对依赖服务进行一次健康检查,如果服务恢复了,则断路器关闭,随后完全恢复调用;
  • 关闭状态:断路器完全关闭,走正常的请求调用流程。

一、工作原理

我们先来看下断路器的基本工作流程,还是下面这张老图,可以看到只要执行command,请求就一定会经过断路器:

1.1 关闭->打开

如果配置了circuitBreaker.enabled = true,即允许断路器工作,那么初始时断路器的状态为 关闭 。当在一个时间窗口内(默认10s),请求流量超过了一定的阈值(默认20次),Hristrix就会去判断要不要断路,断路的依据是: 异常请求数量占总请求量的比值是否超过某个阈值,此时断路器就会打开 。

举个例子,假设时间窗口为10s,请求阈值为20次,如果10s内经过短路器的请求共10次,那么根本不会去判断要不要断路,即使这10次请求全部是异常的。如果10s内经过短路器的请求超过20次,同时其中异常的请求数量,占到了一定的比例,就会开启断路,断路器从close状态转换到open状态。此时,再有请求过来,都不会走后端服务,而是全部走fallback降级。

circuitBreaker.requestVolumeThreshold:请求总量阈值,默认20
circuitBreaker.errorThresholdPercentage:异常请求百分比,默认50,即50%

1.2 打开->半开

当断路器开启一段时间之后(默认5s),会尝试放过去一部分流量进行试探,确定依赖服务是否恢复了。此时断路器的状态为变成半开(half-open), 如果服务完全恢复了,则断路器状态会转换成关闭,随后完全恢复调用。

circuitBreaker.sleepWindowInMilliseconds:半开试探休眠时间,默认值5000ms。

二、示例

接下来,我们通过示例来看下如何使用Hystrix的熔断功能。

2.1 command改写

    /**
     * 封装获取商品信息的请求,采用线程池隔离。
     * HystrixCommand中的泛型是请求返回的类型,此处是商品信息ProductInfo
     */
    public class GetProductInfoCommand extends HystrixCommand<ProductInfo> {
    
        private final Long productId;
    
        public GetProductInfoCommand(Long productId) {
            // 将command与线程池关联
            super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoCommandGroup")
                 .andCommandPropertiesDefaults(
                     HystrixCommandProperties.Setter()
                         .withCircuitBreakerRequestVolumeThreshold(30)
                         .withCircuitBreakerErrorThresholdPercentage(40))
                         .withCircuitBreakerSleepWindowInMilliseconds(6000));
            this.productId = productId;
        }
    
        /**
          * run方法里执行的是真正请求处理逻辑
          */
        @Override
        protected ProductInfo run() {
            // 拿到一个商品id
            // 调用商品服务的接口,获取商品id对应的商品的最新数据
            // 用HttpClient去调用商品服务的http接口
            String url = "http://127.0.0.1:8082/getProductInfo?productId=" + productId;
            String response = HttpClientUtils.sendGetRequest(url);
    
            return JSONObject.parseObject(response, ProductInfo.class);
        }
    }

上述构造函数中,设置了请求总量阈值为30,异常请求百分比为40%,半开试探休眠时间6s。

这样,如果10s内总请求数超过30次,且异常请求占40%,就会打开断路器,后续的所有请求都会走fallback降级。

三、总结

本章,我介绍了Hystrix的熔断功能,读者要特别注意断路器的三种状态之间的转换关系,Hystrix对所有command请求进行监控统计,当异常请求达到一定比例时,就会触发熔断机制。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值