聊聊Hystrix的源码

  • Post author:
  • Post category:其他


今天我们说一下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的源码内容对我们以后分析服务的熔断等功能是有帮助的。



版权声明:本文为ch98000原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。