且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2021-11-20 14:33:44

上文给大家讲解的内容是Hystrix的核心工作原理,那么本文给大家介绍的内容是Hystrix源码解析;


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

Hystrix源码解析

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

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


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

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


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


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

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

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


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

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


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


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

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


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


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

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

本文给大家讲解的内容是微服务容错与隔离:Hystrix源码解析

  1. 下篇文章给大家讲解的内容是系统集成服务集成交互技术:网络协议
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!