概述
Feign是如何集成Sentinel和Hystrix的?
通过代码解读进行剖析。
Spring初始化过程之Feign集成Sentinel与hystrix组件的解读
1、BeanDefinition过程
EnableFeignClients->FeignClientsRegistrar->FeignClientFactoryBean;
2、 DI过程,依赖注入,初始化FeignClientFactoryBean,方法流程;
FeignClientFactoryBean::getObject->getTarget->feign方法->get方法;
get方法是从现有的Spring容器中找到已经加载的Feign.Builder,并且进行实例化。
Feign.Builder是什么时候加载到Spring容器的,也就是决定使用SentinelFeign.Builder还是HystrixFeign.Builder,此处是关键。
在包spring-cloud-operfeign-core中
默认情况下,使用FeignClientsConfiguration中注册的Feign.Builder;此处进行的声明
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
public Feign.Builder feignBuilder(Retryer retryer) {
return Feign.builder().retryer(retryer);
}
在spring-cloud-starter-alibaba-sentinel包中有一个配置类SentinelFeignAutoConfiguration,前提是Feign.Builder
没有被注册过,并且feign.sentinel.enabled 是被设置在配置文件中的;
@Bean @Scope("prototype")
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "feign.sentinel.enabled")
public Feign.Builder feignSentinelBuilder() {
return SentinelFeign.builder();
}
此处进行注入的;
在包spring-cloud-operfeign-core中,FeignClientsConfiguration类中,有一个HystrixFeignConfiguration类,配置使用HystrixFeign.Builder,但是此处需要引入hystrix的包才会被配置,代码如下:
@Configuration
@ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })
protected static class HystrixFeignConfiguration {
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "feign.hystrix.enabled")
public Feign.Builder feignHystrixBuilder() {
return HystrixFeign.builder();
}
}
所以按照特定的条件就可以使用Sentinel或者hystrix。
总结:集成主要是两个方面:
1、是否加入相关配置(如:feign.sentinel.enabled)
2、是否引入相关包(Sentinel或者hystrix)
引申一个问题:
在Sentinel和hystrix都引入和配置的情况下,会采用哪个配置?
答案:优先使用Sentinel,原因:在HystrixTargeter中的target方法有一个逻辑:
if (!(feign instanceof feign.hystrix.HystrixFeign.Builder)) {
return feign.target(target);
}
即当前的实例不是feign.hystrix.HystrixFeign.Builder,则采用其他。
最后
以上就是时尚红酒为你收集整理的Feign、Sentinel和Hystrix源码解读的全部内容,希望文章能够帮你解决Feign、Sentinel和Hystrix源码解读所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复