Feign、httpclient、OkHttp3 结合使用
疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【博客园总入口 】
疯狂创客圈 正在进行分布式和高并发基础原理 的研习,比如下面的一些基础性的内容:
一、Netty Redis 亿级流量 高并发 实战
二、高并发 springcloud + zookeeper 秒杀
以及有关Springcloud 几篇核心、重要的文章:
一、Springcloud 配置, 史上最全 一文全懂
二、Feign Ribbon Hystrix 三者关系 , 史上最全 深度解析
三、SpringCloud gateway 详解 , 史上最全
五、常识纠错:Feign 默认不用 短连接
六、Feign 核心原理,图解
1 Feign 客户端实现 类型前面介绍到了常用的Feign客户端实现类,大致如下:
(1) Client.Default类:默认的 feign.Client 客户端实现类,内部使用HttpURLConnnection 完成HTTP URL请求处理;
(2) ApacheHttpClient 类:内部使用 Apache httpclient 开源组件完成HTTP URL请求处理的feign.Client 客户端实现类;
(3) OkHttpClient类:内部使用 OkHttp3 开源组件完成HTTP URL请求处理的feign.Client 客户端实现类。
(4) LoadBalancerFeignClient 类:这是一个特殊的 feign.Client 客户端实现类。内部先使用 Ribbon 负载均衡算法计算server服务器,然后使用包装的 delegate 客户端实例,去完成 HTTP URL请求处理。
Feign 在启动的时候,有两个与feign.Client 客户端实例相关的自动配置类,根据多种条件组合,去创建不同类型的 客户端Spring IOC容器实例。
1.1.1 配置 LoadBalancerFeignClient 负载均衡容器实例Feign有两个与Client相关的自动配置类:
(1)org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration
(2)org.springframework.cloud.openfeign.FeignAutoConfiguration
第一个自动配置类,能够配置具有负载均衡能力的FeignClient容器实例;第二自动配置类,只能配置最原始的FeignClient容器实例。
具备负载均衡能力的 FeignClient 容器实例,所对应的类型为 LoadBalancerFeignClient 类型。前面讲到,在SpringCloud中,为了达到高可用,一个微服务至少应该部署两个以上节点,从这个角度来说,LoadBalancerFeignClient 容器实例,已经成为事实上的标配。
事实上,第一个自动配置类 FeignRibbonClientAutoConfiguration,在容器的装配次序上,是优先于第二个自动配置类 FeignAutoConfiguration 的。具体可以参见其源码,节选如下:
import com.netflix.loadbalancer.ILoadBalancer; //…. @ConditionalOnClass({ILoadBalancer.class, Feign.class}) @Configuration @AutoConfigureBefore({FeignAutoConfiguration.class}) // 本配置类具备优先权 @EnableConfigurationProperties({FeignHttpClientProperties.class}) @Import({ HttpClientFeignLoadBalancedConfiguration.class, //配置:包装ApacheHttpClient实例的负载均衡客户端 OkHttpFeignLoadBalancedConfiguration.class, //配置:包装OkHttpClient 实例的负载均衡客户端 DefaultFeignLoadBalancedConfiguration.class //配置:包装Client.Default 实例的负载均衡客户端 }) public class FeignRibbonClientAutoConfiguration { //空的构造器 public FeignRibbonClientAutoConfiguration() { } //…. }从源码中可以看到,FeignRibbonClientAutoConfiguration 的自动配置有两个前提条件:
(1)当前的类路径中,存在 ILoadBalancer.class 接口
(2)当前的类路径中,存在 Feign.class 接口
在这里,重点说一下 ILoadBalancer.class 接口,该接口处于 ribbon 的jar包中。如果需要在类路径中导入该jar包,则需要在Maven的pom.xml文件中,增加 ribbon 的相关依赖,具体如下:
<!-- ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>为了加深大家对客户端负载均衡的理解,这里将 ILoadBalancer.class 接口的两个重要的抽象方法列出来,具体如下:
package com.netflix.loadbalancer; import java.util.List; public interface ILoadBalancer { // 通过负载均衡算法计算server服务器 Server chooseServer(Object var1); // 取得全部的服务器 List<Server> getAllServers(); //… }FeignRibbonClientAutoConfiguration 自动配置类,并没有直接配置LoadBalancerFeignClient 容器实例,而是使用@Import注解,通过导入其他配置类的方式,完成 LoadBalancerFeignClient 客户端容器实例的配置。
分别导入了以下三个自动配置类:
(1) HttpClientFeignLoadBalancedConfiguration.class
该配置类,负责配置一个包装 ApacheHttpClient 实例的 LoadBalancerFeignClient负载均衡客户端。
(2) OkHttpFeignLoadBalancedConfiguration.class
该配置类,负责配置一个包装 OkHttpClient 实例的 LoadBalancerFeignClient负载均衡客户端。
(3) DefaultFeignLoadBalancedConfiguration.class
该配置类,负责配置一个包装 Client.Default 实例的 LoadBalancerFeignClient负载均衡客户端。
1.1.2 包装 ApacheHttpClient 实例的负载均衡容器实例温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/41916.html
- 上一篇:CSS测试题Ⅰ
- 下一篇:AngleSharp 自带的HttpRequest参数设置