Feign中使用HttpClient和OKHttp、负载均衡实现

╰半橙微兮° 2021-08-29 18:00 958阅读 0赞

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,代码如下:
在这里插入图片描述

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

在这里插入图片描述

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

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

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

  1. <dependency>
  2. <groupId>com.netflix.feign</groupId>
  3. <artifactId>feign-httpclient</artifactId>
  4. <version>RELEASE</version>
  5. </dependency>

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

  1. <dependency>
  2. <groupId>com.netflix.feign</groupId>
  3. <artifactId>feign-okhttp</artifactId>
  4. <version>RELEASE</version>
  5. </dependency>

Feign是如何实现负载均衡的

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

其中有一个executeWithLoadBalancer()方法,即通过负载均衡的方式来执行网络请求:
在这里插入图片描述

在上述代码中,有一个submit()方法,进入submit()方法的内部可以看出它是LoadBalancerCommand类的方法:
在这里插入图片描述
在上述代码中,有一个selectServer()方法,该方法是选择服务进行负载均衡的方法:

在这里插入图片描述
最终负载均衡交给loadBalancerContext来处理。

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,958人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用Feign负载均衡

    Feign 也是在客户端的负载均衡。其也集成了Ribbon负债均衡,它与Ribbon不同的是通过肺功能只要定义 服务绑定接口且以声明式的方法,优雅而简单的实现了服务的调用。

    相关 Feign实现负载均衡

      Feign是一个声明式WebService客户端,使用方法是定义一个接口并在上面添加注解即可。Feign支持可拔插式的编码器和解码器。   Spring Cloud对