Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决硬编码的代码可读性差、参数复杂URL难以维护的问题。
使用步骤
Fegin的使用步骤非常简单
1) pom文件当中引入feign的依赖
2) 在启动类添加注解@EnableFeignClients
开启Feign的功能
3) 编写Feign的客户端
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
该接口当中包含了如下信息:服务名称:userservice
、请求方式:GET
、请求路径:/user/{id}
、请求参数:Long id
、返回值类型:User
,这样,Feign就可以帮助我们发送http请求
4) 调用
在需要发送该请求的地方,注入该接口,然后直接调用该方法即可
@Autowired
private UserClient userClient;
public XXX XxxXxx(Xxx xxx) {
*****************
*****************
//直接调用
User user = userClient.findById(id);
*****************
*****************
}
使用优化
Feign底层客户端实现包括:
-
URLConnection:默认实现,不支持连接池
-
Apache HttpClient :支持连接池
-
OKHttp:支持连接池
因此可以使用HttpClient或者OKHttp代替默认的URLConnection来提高Feign的性能。
步骤也非常简单:
1) 引入依赖,feign-httpclient或者ok-http
2) 在配置文件中添加配置,配置连接池(以httpclient为例)
feign:
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
除了以上优化方法外,日志级别用basic也可以提高Feign的性能
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
日志的级别分为四种:
- NONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
实际开发当中的使用
实际开发当中我们将Feign的XxxClient抽取为独立模块feign-api,并且把有关的POJO、默认的Feign配置都放到这个模块中,所有微服务引用该模块的依赖包,即可直接调用。
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
注意:
模块feign-api当中XxxClient所在的包名通常与服务消费者的@EnableFeignClients
注解所在的包名(启动类所在的包)不一致,因此无法扫描到UserClient。
有两种方式解决:
方式一:
指定Feign应该扫描的包:
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:
指定需要加载的Client接口:
@EnableFeignClients(clients = {UserClient.class})