feign远程调用学习
Feign是一个声明式HTTP客户端,帮助我们发送Http请求
https://github.com/OpenFeign/feign
为什么使用Feign?
当一个微服务调用另外一个微服务时,通过Rest风格的http请求调用目标微服务的接口。之前学习中使用的RestTemplate,传入URL发出请求
如http://localhost:注册的服务名/uri
这种方式如果URL参数复杂,难以维护
使用Feign可以帮助我们解决这个问题
使用Feign替代RestTemplate
使用步骤
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 添加注解
在服务的启动类上添加 @EnableFeignClients 注解
- 新建Feign接口
@FeignClient("目标服务名")
public interface 接口名{
请求方式(请求路径)
返回值类型 方法名(请求参数);
例如:
@@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
- 远程调用
1. 注入Feign接口
2. 使用接口方法
Feign配置
- logger.level 日志级别
1. 配置文件方式
feign:
client:
config:
default(全局)/服务名(单个服务)
loggerLevel: BASIC
2. Java代码方式
2.1 声明一个类,声明一个Logger.Level类型的对象
2.2.1
全局生效: 在启动类的@EnableFeignClient注解上添加defaultConfigeration属性,值为声明的类的class
服务生效:在目标服务类的@FeignClient注解上添加value = 属性名,configeration = 配置类class
NONE 不记录任何日志,默认级别
BASIC 记录请求方法、URL、响应状态码、执行时间
HEADERS 在BASIC的基础上额外记录请求头和响应头
FULL 记录所有请求和响应的信息,包括头、体、元数据
Feign优化
- Feign发起http请求依赖其他客户端,使用支持连接池的客户端
- 日志级别
URLConnection 默认客户端,不支持连接池
Apcahe HttpClient 支持连接池
OKHttp 支持连接池
1.1 使用HttpClient替换默认客户端
添加HttpClient依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置文件
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
实践
- feign的接口与controller相似,抽取共性
1. 使用继承,controller与feign继承同一个接口,该接口写明了路径、方法、返回值、参数
简单且代码共享,但耦合度高,参数中的注解不会被继承,在controller中需要声明
2. 抽取为一个Feign远程调用的微服务,其他微服务依赖该服务
将pojo与feign配置都放置在该服务中,所有消费者依赖该服务
流程
- 创建Feign服务,引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 将Client,config,pojo放入该服务
- 在消费者服务中使用
1. 删除之前有关feign的类或接口
2. 进入自定义的feign服务依赖
3. 修改 @EnableFeignClients 扫描路径
1. basePackages指定扫描包为Feign服务的client包 .格式的包名
2. client属性指定加载的client接口 接收class

浙公网安备 33010602011771号