Feign中使用HttpClient和OKHttp

在Feign中,Client是一个非常重要的组件,Feign最终发送Request请求以及接收Response响应都是由Client 组件完成的。

Client 在Feign源码中是一个接口,在默认的情况下,Client的实现类是Client.Default, Client.Default 是由HttpURLConnnection来实现网络请求的。另外,Client还支持HttpClient和OkhHttp来进行网络请求。

首先查看FeignRibbonClient的自动配置类FeignRibbonClientAutoConfiguration,该类在工程启动时注入一些Bean,其中注入了一个BeanName为feignClient 的Client类型的Bean,代码如下:

Feign 开启负载均衡_Feign

在缺省配置BeanName为FeignClient的Bean的情况下,会自动注入Client.Default这个对象,跟踪Client.Default源码,Cllient.Default使用的网络请求框架为HttpURLConnection:

Feign 开启负载均衡_Feign 开启负载均衡_02

那么,如何在Feign中使用HttpClient的网络请求框架呢?下面继续查看FeignRibbonClientAutoConfiguration的源码:

从代码@ConditionalOnClass(ApacheHttpClient.class)注解可以知道,只需要在pom文件加上HttpClient的Classpath即可。另外需要在配置文件application.yml中配置feign.httpclient.enabled为true,从@ConditionalONProperty注解可知,这个配置可以不写,因为在默认的情况下就为true。

在工程的pom文件上加上feign-httpclient的依赖,Feign就会采用HttpClient作为网络请求框架,而不是默认的HttpURLConnection:

<dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>RELEASE</version>
        </dependency>

同样,如果想要Feign中使用Okhttp作为网络请求框架,则只需要在pom文件上加上feign-okhttp的依赖:

<dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-okhttp</artifactId>
            <version>RELEASE</version>
        </dependency>
Feign是如何实现负载均衡的

FeignRibbonClientAutoConfiguration类配置了Client 的类型( 包括HttpURLConnection、OkHttp和HttpClient),最终向容器注入的是Client 的实现类LoadBalancerFeignClient,即负载均衡客户端。查看LoadBalancerFeignClient类中的execute 方法,即执行请求的方法,代码如下:

Feign 开启负载均衡_网络请求_03

其中有一个executeWithLoadBalancer()方法,即通过负载均衡的方式来执行网络请求:

Feign 开启负载均衡_Feign_04

在上述代码中,有一个submit()方法,进入submit()方法的内部可以看出它是LoadBalancerCommand类的方法:

Feign 开启负载均衡_Feign 开启负载均衡_05


在上述代码中,有一个selectServer()方法,该方法是选择服务进行负载均衡的方法:

Feign 开启负载均衡_网络请求框架_06


最终负载均衡交给loadBalancerContext来处理。

Feign 开启负载均衡_Feign_07