SpringCloudRPC 远程调用核心原理:feign
FeignRibbonClientAutoConfiguration 自动配置类并没有直接配置 LoadBalancerFeignClient 容器实例,而是使用 @Import 注解。通过导入其他配置类的方式完成 LoadBalancerFeignClient 客户端容器实例的配置。
分别导入了以下 3 个自动配置类:
(1)
HttpClientFeignLoadBalancedConfiguration.class:该配置类
负责配置一个包装 ApacheHttpClient 实例的 LoadBalancerFeignClient 负载均衡客户端容器实例。
(2)
OkHttpFeignLoadBalancedConfiguration.class:该配置类负责配置一个包装 OkHttpClient 实例的 LoadBalancerFeignClient 负载均衡客户端容器实例。
(3)
DefaultFeignLoadBalancedConfiguration.class:该配置类负责配置一个包装 Client.Default 实例的 LoadBalancerFeignClient 负载均衡客户端容器实例。
装配 ApacheHttpClient 负载均衡容器实例
==========================
首先来看如何配置一个包装 ApacheHttpClient 实例的负载均衡客户端容器实例。这个 IOC 实例的配置由
HttpClientFeignLoadBalancedConfiguration 自动配置类完成,其源码节选如下:
@Configuration
@ConditionalOnClass({ApacheHttpClient.class})
@ConditionalOnProperty(
value = {"feign.httpclient.enabled"},
matchIfMissing = true
)
class HttpClientFeignLoadBalancedConfiguration {
//空的构造器
HttpClientFeignLoadBalancedConfiguration() {
}
@Bean
@ConditionalOnMissingBean({Client.class})
public Client feignClient(
CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory, HttpClient httpClient)
{
ApacheHttpClient delegate = new ApacheHttpClient(httpClient);
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); //进行包装
}
...
首先来看源码中的 feignClient()方法,分为两步:
(1)创建一个 ApacheHttpClient 类型的 fe Java 开源项目【ali1024.coding.net/public/P7/Java/git】 ign.Client 客户端实例,该实例的内部使用 Apache httpclient 开源组件完成 HTTP 请求处理。
(2)创建一个 LoadBalancerFeignClient 负载均衡客户端实例,将 ApacheHttpClient 实例包装起来,然后返回该包装实例,作为 feign.Client 类型的 Spring IOC 容器实例。
接下来介绍
HttpClientFeignLoadBalancedConfiguration 类上的两个重要注解:@ConditionalOnClass(ApacheHttp 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 Client.class)和 @ConditionalOnProperty(value="feign.httpclient.enabled",matchIfMissing=true)。
这两个条件的含义为:
(1)必须满足 ApacheHttpClient.class 在当前的类路径中存在。
(2)必须满足工程配置文件中 feign.httpclient.enabled 配置项的值为 true。
如果以上两个条件同时满足,
HttpClientFeignLoadBalancedConfiguration 自动配置工作就会启动。
具体如何验证呢?首先在应用配置文件中将配置项 feign.httpclient.enabled 的值设置为 false,然后在
HttpClientFeignLoadBalancedConfiguration 的 feignClient()方法内的某行设置断点,重新启动项目,注意观察,会发现整个启动过程中断点没有被命中。
接下来,将配置项 feign.httpclient.enabled 的值设置为 true,再一次启动项目,发现断点被命中。由此可见,验证
HttpClientFeignLoadBalancedConfiguration 自动配置类被启动。
为了满足 @ConditionalOnClass(ApacheHttpClient.class)的条件要求,需要为 pom 文件加上 feign-httpclient 和 httpclient 组件相关的 Maven 依赖,具体如下:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>9.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
对于 feign.httpclient.enabled 配置项来说,@ConditionalOnProperty 的 matchIfMissing 属性值默认为 true,也就是说,这个属性在默认情况下就为 true。
装配 OkHttpClient 负载均衡容器实例
======================
接下来看如何配置一个包装 OkHttpClient 实例的负载均衡客户端容器实例。这个 IOC 实例的配置,由
OkHttpFeignLoadBalancedConfiguration 自动配置类负责完成,其源码节选如下:
@Configuration
@ConditionalOnClass({OkHttpClient.class})
@ConditionalOnProperty("feign.okhttp.enabled")
class OkHttpFeignLoadBalancedConfiguration {
//空的构造器
OkHttpFeignLoadBalancedConfiguration () {
}
@Bean
@ConditionalOnMissingBean({Client.class})
public Client feignClient(
CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory, HttpClient httpClient)
{
OkHttpClient delegate = new OkHttpClient (httpClient);
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); //进行包装
}
...
}
首先来看源码中的 feignClient()方法,分为两步:
(1)创建一个 OkHttpClient 类型的客户端实例,该实例的内部使用 OkHttp3 开源组件来完成 HTTP 请求处理。
(2)创建一个 LoadBalancerFeignClient 负载均衡客户端实例,将 OkHttpClient 实例包装起来,然后返回 LoadBalancerFeignClient 客户端实例作为 feign.Client 客户端 IOC 容器实例。
接下来介绍
OkHttpFeignLoadBalancedConfiguration 类上的两个重要的注解:@ConditionalOnClass(OkHttpClient.class)和 @ConditionalOnProperty("feign.okhttp.enabled")。
这两个条件的含义为:
(1)必须满足 OkHttpClient.class 在当前类路径中存在。
(2)必须满足工程配置文件中 feign.okhttp.enabled 配置项的值为 true。
如果以上两个条件同时满足,
OkHttpFeignLoadBalancedConfiguration 自动配置工作就会启动。
为了满足 @ConditionalOnClass(OkHttpClient.class)的条件要求,由于 OkHttpClient.class 类的位置处于 feign-okhttp 相关的 JAR 包中,因此需要在 pom 文件加上 feign-okhttp 和 okhttp3 相关的 Maven 依赖,具体如下:
<dependency>
总结
谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
并且我也将自己刷的题全部整理成了 PDF 或者 Word 文档(含详细答案解析)
66 个 Java 面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
算法刷题(PDF)
评论