聊聊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修饰的方法的增强
- 首先会对@HystrixCommand的配置信息进行读取,封装到MetaHolder中,
- 使用元数据MetaHolder创建的可执行器对象GenericCommand,GenericCommand的父类AbstractCommand的构造方法定义了线程池、熔断器等属性,线程池是使用
ConcurrentHashMap集合的HystrixThreadPool,GenericCommand中重写了run()方法和getFallback()方法,run()中是对原始方法的调用,而getFallback()方法中是对回退方法的调用
- 根据元数据MetaHolder中的信息获取执行方式,有同步异步和响应式方式,一般是同步
- 然后调用CommandExecutor.execute()方法进行执行,先是调用castToExecutable()把 GenericCommand转为HystrixExecutable的实例,然后调用HystrixExecutable的execute()方法,这里返回是Future对象,也就是异步处理的结果,涉及到响应式编程RxJava,它会调用GenericCommand中重写的run()方法和getFallback()方法
总结
这篇文章主要介绍了Hystrix是怎么进行初始化的话,主要利用了SpringBoot的自动配置和Aspect面向切面编程和RxJava响应式编程,了解了Hystrix的源码内容对我们以后分析服务的熔断等功能是有帮助的。