3-7Feign 客户端组件替换 · SpringCloud微服务实战 · 看云 (1)

6. Feign 客户端组件替换

导航

本节代码地址


Feign 中默认使用的是HttpClient 来进行接口调用,我们现在使用OkHttp替换掉HttpClient

6.1 什么是 okhttp ?

okhttp 是由 square 公司开源的一个 http 客户端。是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟

okhttp 的设计初衷就是简单和高效,这也是我们选择它的重要原因之一。它的优势如下:

  • 支持 HTTP/2 协议。
  • 允许连接到同一个主机地址的所有请求,提高请求效率。
  • 共享Socket,减少对服务器的请求次数。
  • 通过连接池,减少了请求延迟。
  • 缓存响应数据来减少重复的网络请求。
  • 减少了对数据流量的消耗。
  • 自动处理GZip压缩。

6.2新建项目

新建项目fw-cloud-feign-okhttp用于将HttpClient替换OkHttp,代码里的内容和fw-cloud-feign内容一样,拷贝过来即可。

6.3 maven 配置

fw-cloud-feign中的pom 文件拷贝过来,并添加一下配置

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>${okhttp.version}</version>
</dependency>

6.4 新建OkHttp的配置

这里就不需要HttpClient的之前的config配置了。下面的配置主要是一个demo性质的,实际项目中可以修改为读取application.yml 或application.properties里面的内容。


@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignOkHttpConfig {

    @Bean
    public okhttp3.OkHttpClient okHttpClient(){
        return new okhttp3.OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)  
                .connectTimeout(60, TimeUnit.SECONDS) 
                .writeTimeout(120, TimeUnit.SECONDS) 
                .connectionPool(new ConnectionPool())
                .addInterceptor(new OkHttpLogInterceptor())
                .build();
    }
}

OkHttpLogInterceptor 是为了记录连接的url日志


@Slf4j
public class OkHttpLogInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        log.info("OkHttpUrl : " + chain.request().url());
        return chain.proceed(chain.request());
    }
}

6.5 重启项目

Postman 输入localhost:8771/feignInfo可以看到和之前的结果一样,但是日志有区别了。
e7769c8f40acfcae784228b73e54e008_MD5.webp

2019-12-28 19:22:06.331  INFO 36500 --- [nio-8771-exec-1] c.y.feign.config.OkHttpLogInterceptor    : OkHttpUrl : http://desktop-375c7dm:8764/hello
2019-12-28 19:22:07.226  INFO 36500 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: fw-register-eureka-client.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2019-12-28 19:22:07.360  INFO 36500 --- [nio-8771-exec-1] c.y.feign.config.OkHttpLogInterceptor    : OkHttpUrl : http://desktop-375c7dm:8763/hello
2019-12-28 19:22:07.854  INFO 36500 --- [nio-8771-exec-1] c.y.f.controller.EurekaFeignController   : hello:8763