0%

Feign性能优化与实践

Feign底层客户端实现

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

优化Feign的性能主要包括

  • 使用连接池代替默认的URLConnection
  • 日志级别,最好用basic或者none

Feign添加HttpClient支持

  • 引入依赖
1
2
3
4
5
<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
  • 配置连接池
1
2
3
4
5
feign:
httpclient:
enabled: true # 支持httpClient开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个请求路径最大连接

Feign的最佳实践

  • 方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
    • 客户端和服务端共享接口,紧耦合
    • 对Spring MVC 无效
  • 方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到该模块中,提供给消费者调用
    • 消费者需要方法不同,单独对于一个消费者来说,有的方法较为多余

抽取FeignClient

  • 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
  • 将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到项目中
  • 在order-service中引入feign-api的依赖
  • 修改order-service中与上述三个组件有关的import部分,改成导入feign-api中的包
  • 重启测试
  • 当定义的Client不在Spring扫描范围时,Client无法使用。两种方案:

    • 指定FeignClient所在包
    1
    @EnableFeignClients(basePackages = "cn.itcast.feign.clients")
    • 指定FeignClient字节码
    1
    @EnableFeignClients(clients = {UserClient.class})
------ THEEND ------

欢迎关注我的其它发布渠道