聊聊hystrix的源码(代码片段)

周杰伦本人 周杰伦本人     2022-12-03     294

关键词:

聊聊Hystrix的源码

今天我们说一下Hystrix的源码的内容

@EnableCircuitBreaker注解

需要使用Hystrix 的时候,需要我们通过@EnableCircuitBreaker来开启断路器,那么我们看一下这个注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(EnableCircuitBreakerImportSelector.class)
public @interface EnableCircuitBreaker 


注解中导入了EnableCircuitBreakerImportSelector类,EnableCircuitBreakerImportSelector继承SpringFactoryImportSelector,它的isEnabled()方获取spring.cloud.circuit.breaker.enabled的配置默认是true

SpringFactoryImportSelector的annotationClass属性根据构造方法可以知道

annotationClass是获取子类中的注解,也就是EnableCircuitBreaker注解,在它的selectImports()方法中通过SpringFactoriesLoader的loadFactoryNames()方法加载META-INF/spring.factories文件下的EnableCircuitBreaker对应的类HystrixCircuitBreakerConfiguration

org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\\
org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration

HystrixCircuitBreakerConfiguration配置类

我们看一下自动装配的HystrixCircuitBreakerConfiguration类:

@Bean
public HystrixCommandAspect hystrixCommandAspect() 
    return new HystrixCommandAspect();

类中定义了HystrixCommandAspect面向切面编程和RxJava响应式编程,了解了Hystrix的源码内容对我们以后分析服务的熔断是有邦之的。,这是一个切面类,类中定义了注解@HystrixCommand的方法的切入点,methodsAnnotatedWithHystrixCommand()方法是对注解@HystrixCommand修饰的方法的增强

  1. 首先会对@HystrixCommand的配置信息进行读取,封装到MetaHolder中,
  2. 使用元数据MetaHolder创建的可执行器对象GenericCommand,GenericCommand的父类AbstractCommand的构造方法定义了线程池、熔断器等属性,线程池是使用

ConcurrentHashMap集合的HystrixThreadPool,GenericCommand中重写了run()方法和getFallback()方法,run()中是对原始方法的调用,而getFallback()方法中是对回退方法的调用

  1. 根据元数据MetaHolder中的信息获取执行方式,有同步异步和响应式方式,一般是同步
  2. 然后调用CommandExecutor.execute()方法进行执行,先是调用castToExecutable()把 GenericCommand转为HystrixExecutable的实例,然后调用HystrixExecutable的execute()方法,这里返回是Future对象,也就是异步处理的结果,涉及到响应式编程RxJava,它会调用GenericCommand中重写的run()方法和getFallback()方法

总结

这篇文章主要介绍了Hystrix是怎么进行初始化的话,主要利用了SpringBoot的自动配置和Aspect面向切面编程和RxJava响应式编程,了解了Hystrix的源码内容对我们以后分析服务的熔断等功能是有帮助的。

hystrix源码解析(代码片段)

1.Hystrix源码解析1.1.@HystrixCommand原理直接通过Aspect切面来做的1.2.feignhystrix原理它的本质原理就是对HystrixCommand的动态代理封装1.2.1.如何启动Feignhystrix的?在openFeign里,已经封装了Hystrix,当feign.hystrix.enabled为true时生效Github地址:htt... 查看详情

hystrix简单聊聊断路器/熔断器(代码片段)

什么是HystrixHystrix在SpringCloud中负责服务熔断服务降级的作用。Hystrix存在的目的也是为了防止过多超时导致系统瘫痪。比如多个服务之间的相互调用,如下图:订单->商品->积分->日志订单->支付->日志商品->风控->... 查看详情

聊聊ribbon源码解读(代码片段)

聊聊Ribbon源码解读要说当今最流行的组件当然是SpringCloud,要说框架中最流行的负载均衡组件,非Ribbon莫属了@LoadBalanced注解当我们使用Ribbon的时候,spring中注入RestTemplate,并在上边添加@LoadBalanced,这样使用RestTemplate发送请求的... 查看详情

聊聊ribbon源码解读之负载均衡(代码片段)

聊聊Ribbon源码解读之负载均衡上篇文章我们说到RibbonLoadBalancerClient的execute()方法需要获取负载均衡器负载均衡器深入getLoadBalancer()方法我们发现它就是调用SpringClientFactory的getInstance()方法获取的是ILoadBalancer的实例,那么ILoadBalancer... 查看详情

从源码分析hystrix工作机制(代码片段)

一、Hystrix解决了什么问题?在复杂的分布式应用中有着许多的依赖,各个依赖都难免会在某个时刻失败,如果应用不隔离各个依赖,降低外部的风险,那容易拖垮整个应用。举个电商场景中常见的例子,... 查看详情

从源码分析hystrix工作机制(代码片段)

一、Hystrix解决了什么问题?在复杂的分布式应用中有着许多的依赖,各个依赖都难免会在某个时刻失败,如果应用不隔离各个依赖,降低外部的风险,那容易拖垮整个应用。举个电商场景中常见的例子,... 查看详情

聊聊hystrix

聊聊HystrixHystrix也是SpringCloud框架中的重要组件,它的功能有跳闸机制,也就是当服务的错误率超过一定的阈值的时候,Hystrix在一段时间内停止请求这个服务,它还有资源隔离的功能,也就是每个方法都可以使用一个小型的线程... 查看详情

hystrix源码分析(代码片段)

最近遇到了一些生产问题涉及到了hystrix,想要了解下底层的原理。hystrix中大量运用了Rxjava的响应式编程,不懂Rxjava,理解起来有点费劲。基本准备<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http:/... 查看详情

聊聊kafka:编译kafka源码并搭建源码环境(代码片段)

一、前言老周这里编译Kafka的版本是2.7,为啥采用这个版本来搭建源码的阅读环境呢?因为该版本相对来说比较新。而我为啥不用2.7后的版本呢?比如2.8,这是因为去掉了ZooKeeper,还不太稳定,生产环境也... 查看详情

聊聊kafka:编译kafka源码并搭建源码环境(代码片段)

一、前言老周这里编译Kafka的版本是2.7,为啥采用这个版本来搭建源码的阅读环境呢?因为该版本相对来说比较新。而我为啥不用2.7后的版本呢?比如2.8,这是因为去掉了ZooKeeper,还不太稳定,生产环境也... 查看详情

不看lifecycle源码,认真聊聊它的实现原理(代码片段)

目录1.lifecycle简介2.lifecycle用法3.lifecycle原理1.lifecycle简介  在我们的日常开发中,使用Activity和Fragment产生的内存泄漏问题比比皆是,主要是原因就是这二者存在生命周期,在走完这一辈子的过程中,有些引用一直... 查看详情

聊聊kafka:producer源码解析(代码片段)

一、前言前面几篇我们讲了关于Kafka的基础架构以及搭建,从这篇开始我们就来源码分析一波。我们这用的Kafka版本是2.7.0,其Client端是由Java实现,Server端是由Scala来实现的,在使用Kafka时,Client是用户最先接触... 查看详情

聊聊kafka:producer源码解析(代码片段)

一、前言前面几篇我们讲了关于Kafka的基础架构以及搭建,从这篇开始我们就来源码分析一波。我们这用的Kafka版本是2.7.0,其Client端是由Java实现,Server端是由Scala来实现的,在使用Kafka时,Client是用户最先接触... 查看详情

聊聊kafka:consumer源码解析之rebalance机制(代码片段)

一、前言我们上一篇分析了Consumer如何加入ConsumerGroup,其实上一篇是一个很宏观的东西,主要讲ConsumerCoordinator怎么与GroupCoordinator通信。等等,老周,ConsumerCoordinator和GroupCoordinator是个啥玩意?这两个组件分别... 查看详情

断路器hystrix与turbine集群监控-springcloud学习第三天(代码片段)

文章大纲一、Hystrix基础介绍二、断路器Hystrix简单使用三、自定义Hystrix请求命令四、Hystrix的服务降级与异常处理五、Hystrix的请求缓存与请求合并六、Hystrix仪表盘与Turbine集群监控七、项目源码与参考资料下载八、参考文章 ... 查看详情

聊聊我的知识体系(代码片段)

不知不觉树义已经工作5年了,一路走来磕磕碰碰但总算有了自己的一点小体会。对于一个Java开发人员来说,到了5年的关键节点,需要掌握哪些知识点呢?经过我自己的总结,我列出了下面的思维导图。从上面的图片我们可以看... 查看详情

聊聊kafka:协调者groupcoordinator源码剖析之实例化与启动groupcoordinator(代码片段)

一、前言在聊聊Kafka系列专栏中,我们前面讲了一篇聊聊Kafka:Consumer源码解析之Consumer如何加入ConsumerGroup,其实那一篇主要讲的是客户端Consumer加入组请求、加入组响应、同步组请求、同步组响应等操作,我们这... 查看详情

聊聊kafka:协调者groupcoordinator源码剖析之实例化与启动groupcoordinator(代码片段)

一、前言在聊聊Kafka系列专栏中,我们前面讲了一篇聊聊Kafka:Consumer源码解析之Consumer如何加入ConsumerGroup,其实那一篇主要讲的是客户端Consumer加入组请求、加入组响应、同步组请求、同步组响应等操作,我们这... 查看详情