Feign使用优化


Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

?URLConnection:默认实现,不支持连接池

?Apache HttpClient :支持连接池

?OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。
这里我们用Apache的HttpClient来演示。

1)引入依赖

在模块的pom文件中引入Apache的HttpClient依赖



    io.github.openfeign
    feign-httpclient

2)配置连接池

在模块的application.yml中添加配置:

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

总结,Feign的优化:

1.日志级别尽量用basic

2.使用HttpClient或OKHttp代替URLConnection

① 引入feign-httpClient依赖

② 配置文件开启httpClient功能,设置连接池参数

Feign最佳实践

所谓最近实践,就是使用过程中总结的经验,最好的一种使用方式。

自习观察可以发现,Feign的客户端与服务提供者的controller代码非常相似:
feign客户端:

Controller:

简化这种重复的代码

继承方式

一样的代码可以通过继承来共享:
1)定义一个API接口,利用定义方法,并基于SpringMVC注解做声明。
2)Feign客户端和Controller都集成该接口

优点:

  • 简单
  • 实现了代码共享

缺点:

  • 服务提供方、服务消费方紧耦合
  • 参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解

抽取方式

将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用

在feign-api中然后引入feign的starter依赖


    org.springframework.cloud
    spring-cloud-starter-openfeign

然后,把模块中中编写的FeignClien客户端、实体类、配置类都复制到feign-api项目中

2)在模块中中使用feign-api

在模块的pom文件中中引入feign-api的依赖:


    cn.itcast.demo
    feign-api
    1.0

#### 4)解决扫描包问题
方式一:

指定Feign应该扫描的包:
在启动类上

@EnableFeignClients(basePackages = "cn.feign.clients")

方式二:
在启动类上
指定需要加载的Client接口:

@EnableFeignClients(clients = {UserClient.class})