• 聊聊Hystrix的源码


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

    @EnableCircuitBreaker注解

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

    1. @Target(ElementType.TYPE)
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Inherited
    5. @Import(EnableCircuitBreakerImportSelector.class)
    6. public @interface EnableCircuitBreaker {
    7. }

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

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

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

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

    HystrixCircuitBreakerConfiguration配置类

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

    1. @Bean
    2. public HystrixCommandAspect hystrixCommandAspect() {
    3. return new HystrixCommandAspect();
    4. }

    类中定义了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的源码内容对我们以后分析服务的熔断等功能是有帮助的。

  • 相关阅读:
    线上服务Java进程假死快速排查、分析
    【Python3】【力扣题】231. 2 的幂
    Flutter Cocoon 已达到 SLSA 2 级标准的要求
    ES6带来那些js新特性?
    网络安全(黑客)——2024自学
    【计算机毕业设计】图像识别水电表读取
    国产智多晶FPGA使用Modelsim仿真RTL设计方法
    IDEA 报错:Process terminated【已解决】
    美国Embarcadero产品经理Marco Cantù谈Delphi/C++ Builder目前开发应用领域
    如何避免写重复代码:善用抽象和组合
  • 原文地址:https://blog.csdn.net/ch98000/article/details/126815067