微服务: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配置到模块中,提供给消费者使用。

image

实现最佳实践方式二的步骤如下:

  1. 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
    image
  2. 在order-service中引入feign-api的依赖
<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>
  1. 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

  2. 重启测试

由于启动类扫描的是当前包及其子包,所以启动项目时无法获取UserClient对象。

解决方式一:在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包

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

解决方式二:在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码

@EnableFeignClients(clients = {UserClient.class})
posted @ 2022-03-04 22:58  Boerk  阅读(568)  评论(0)    收藏  举报