写点什么

SpringCloudRPC 远程调用核心原理:feign

  • 2022 年 4 月 16 日
  • 本文字数:2666 字

    阅读完需:约 9 分钟

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)



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
SpringCloudRPC远程调用核心原理:feign_Java_爱好编程进阶_InfoQ写作平台