当前位置:首页 > Web开发 > 正文

Feign、httpclient、OkHttp3 结合使用

2024-03-31 Web开发

疯狂创客圈 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