微服务:feign调优和抽取
Feign性能调优
Feign底层实现
- URLConnection 默认实现,不支持连接池
- Apache HttpClient 支持连接池
- OkHttp 支持连接池
更改Feign底层实现
- 引入依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
- 修改配置文件
feign:
httpclient:
enabled: true #是否可用
max-connections: 200 #最大链接数
max-connections-per-route: #单个请求路径最大连接数
Feign的最佳实践
方式一:给消费者的FeignClient和提供者的controller定义一个统一的父接口标准。
由于FeignClient和提供者的controller中的方法过于想死
//FeignClient
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
//controller
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
方式二:将FeignClient和controller抽取成独立的模块,并且将油管的pojo、默认的feign配置到模块中,提供给消费者使用。

实现最佳实践方式二的步骤如下:
- 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
![image]()
- 在order-service中引入feign-api的依赖
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
-
修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
-
重启测试
由于启动类扫描的是当前包及其子包,所以启动项目时无法获取UserClient对象。
解决方式一:在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
解决方式二:在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码
@EnableFeignClients(clients = {UserClient.class})


浙公网安备 33010602011771号