写点什么

一线互联网架构师用一文带你彻底吃透 Hystrix 源码,不服真不行

  • 2022 年 4 月 18 日
  • 本文字数:839 字

    阅读完需:约 3 分钟

本文给大家介绍的内容是 Hystrix 源码解析;



Hystrix 源码解析

@HystrixCommand 注解是由名为 javanica 的 Hystrix contrib 库提供的。javanica 是一个 Hystrix 的子项目,用于简化 Hystrix 的使用。

我们还需要添加一个依赖:



查看 hystrix-javanica 的 readme 及注解 @HystrixCommand 的引用可以发现,HystrixCommand-Aspect 实现了对 @HystrixCommand 注解的拦截和处理。下面是 Aspect 拦截部分的实现源码:




HystrixCommand 继承了 AbstractCommand 类,它提供了更多的构造函数和构造参数建造者,最终调用 run 方法实现用户业务逻辑,而 AbstractCommand 类 就 要 实 现 隔 离 、 熔 断 等 核 心 功 能 。如 果 查 看 AbstractCommand 类的代码,你会发现这个类主要使用了 RxJava 响应式框架。下面我们对 AbstractCommand 类的熔断过程加以讲解。

AbstractCommand 类的 initCircuitBreaker 方法是熔断器的构造方法入口,它判断是否打开了熔断器,只有在打开了熔断器后才会通过 HystrixCircuitBreaker.Factory 工厂新建一个熔断器,源码如下:



HystrixCircuitBreaker.Factory 类根据 CommandKey 对熔断器进行了缓存,如果缓存里存在 Key,则直接取缓存里的 Key,如果不存在,则新建 HystrixCircuitBreakerImpl 对象,用于熔断操作,源码如下:




HystrixCircuitBreakerImpl 类里定义了一个状态变量,分别为关闭 、 打 开 、 半 开 状 态 。我 们 重 点 关 注 allowRequest 方 法 , 在 allowRequest 方法里首先判断 forceOpen 属性是否打开,如果打开则不允许有请求进入。然后判断 forceClosed 属性,如果这个属性为 true,刚对所有的请求放行,相当于熔断器不起作用。isAfterSleepWindow 方法用于放行超过了指定时间后的流量。下面是主要的代码实现:




微服务架构的关键技术是为微服务提供高可用、可扩展性、可容错性的平台基础设施。Spring Cloud 作为微服务的治理平台为我们提供了相关的技术和服务组件,而开源的解决方案往往无法做到满足个性需求,我们需要根据实际场景和业务特性做定制化开发。定制化开发的前提是我们能够充分理解这些关键技术的底层运行原理和工作机制。

用户头像

还未添加个人签名 2020.06.14 加入

公众号:该用户快成仙了

评论

发布
暂无评论
一线互联网架构师用一文带你彻底吃透Hystrix源码,不服真不行_互联网架构师小马_InfoQ写作平台