目录
b.在Feign接口的@FeignClient注解中指定使用配置类
全局配置,不仅服务和服务之间会压缩,客户端也会压缩(查看响应头)
1. 概念
作为Spring Cloud的子项目之一,SpringCloud OpenFeign是一种声明式,模板化的HTTP客户端,在SpringCloud中使用OpenFeign,可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求,同时OpenFeign通过集成Ribbon实现客户端的负载均衡
Feign是Spring Cloud最好的HttpClient
Feign和OpenFeign的区别 | |
Feign | OpenFeign |
Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。 | OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 |
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> |
2. 使用方法
2.1⬇️ 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2⬇️ 启动类加注释
在项目的启动类上加@EnableFeignClients注解
2.3⬇️ 添加接口
需要注意:
在OpenFeign中虽然支持SpringMvc的注解,但是用户体验并没有达到原生SpringMvc注解的高度,所以注解中有一部分的属性是不能省略的;例如此处的@PathVariable注解,在原生注解中,被标注的属性名如果和注解中的一致,则可以不在注解中特意标明,但在OpenFeign中,无论是否一致,都需标明,否则运行报错
2.4▶️ 调用接口
注意,接口中的方法名是可以和远程调用的方法名不同的,但是返回值,参数类型和数量,还有请求类型路径都是必须一样
3. 日志配置
3.1 全局配置
3.1.1 配置文件的方式
做完后,可将其转移至Nacos的配置中心去
3.1.2 配置类的方式
@Configuration
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
配置类打完后,配置文件中还是需要添加以下配置信息:
3.2 局部配置
3.2.1 配置类的方式
a.配置类去掉@configuration注解
b.在Feign接口的@FeignClient注解中指定使用配置类
3.2.2 配置文件方式
a.去掉Feign接口中的configuration属性
b.配置文件中指定要调用的微服务名
4. 超时时间配置
在OpenFeign中,默认是1秒钟超时(即从发送远程调用开始,到读取数据返回的过程)
测试:修改服务提供者的接口,加入TimeUnit.SECONDS.sleep(2L);测试异常
解决方式:
4.1 配置文件的形式
4.1.1 全局配置
feign:
client:
config:
default:
#连接时间为1秒钟
connectTimeout: 1000
#读取数据5秒钟
readTimeout: 5000
4.1.2 局部配置
局部的优先级是比全局高的,因此可以在配置完全局后,再给特定的微服务配置
feign:
client:
config:
#将default修改为微服务名称
user-service:
#连接时间为1秒钟
connectTimeout: 1000
#读取数据5秒钟
readTimeout: 5000
4.2 配置类的形式
配置类的全局配置和局部配置与上面的日志配置方式基本相同,这里就不在阐述
5. 性能调优
5.1 客户端组件配置
Feign中默认使用JDK原生的URLConnection发送HTTP请求,我们可以集成别的组件来替换掉URLConnection;
这里主要是涉及到Feign的性能优化问题,因为URLConnection不支持连接池,因此性能低于RestTemplate
如果加入连接池,性能可以提升15%左右.
5.1.1 httpClient
1.pom
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2.配置文件
feign:
httpclient:
enabled: true
#feign的最大连接数
max-connections: 200
#feign单个路径的最大连接数
max-connections-per-route: 50
如果性能提升后还是不能满足高并发的要求,则不使用OpenFeign,使用RestTemplate来进行远程调用
5.2 GZIP压缩配置
前后端分离的项目中,当传输的数据非常大的时候,使用JSON数据就会影响性能,所以就可以使用GZIP进行数据压缩进行性能调优
局部配置,只是针对服务于服务之间
feign:
compression:
request:
#启用请求压缩
enabled: true
#指定应用请求压缩的MIME类型
mime-types: text/xml,application/xml,application/json
#压缩请求的最小大小阈值,如果请求大小小于此阈值,则不会进行压缩
min-request-size: 2048
response:
#启用响应压缩
enabled: true
全局配置,不仅服务和服务之间会压缩,客户端也会压缩(查看响应头)
server:
compression:
enabled: true
#指定应用请求压缩的MIME类型
mime-types: text/xml,application/xml,application/json
#压缩请求的最小大小阈值,如果请求大小小于此阈值,则不会进行压缩
min-request-size: 2048
6. 多参数请求构造
6.1. Feign构造多参数Get请求
当服务提供者的Get风格方法有多个参数时,Feign应该如何传递参数?
6.1.1. 当服务提供者的参数为对象时
6.1.1.1. 属性较少
Feign接口:
服务提供者:
@RequestParam中指定的属性名必须和服务提供者中实体类的属性名相同
6.1.1.2. 属性较多
当需要传递的参数很多时,在Feign接口中使用@RequestParam注解一个个标注参数太过于臃肿,因此也可以使用Map集合传递参数
Feign接口:
服务提供者:
与上面大同小异,Map集合中,值的key必须和服务提供者中实体类的属性名相同
6.1.2. 当服务提供者的参数为多个不同的参数时
第一种方法就是使用@RequestParam注解对应服务提供者的方法参数一个个标注,这种方法太过于简单,这里就不在阐述
第二种方法,其实和6.1.1中描述的大差不差,也是使用Map集合传递参数;Map集合中,属性的key值必须和服务提供者方法中的参数名相同
Feign接口:
服务提供者接口:
6.2. Feign构造多参数Post请求
Post请求的参数传递相对来说就方便许多,可以直接传递对象,当服务提供者的参数为对象时,Feign接口的参数传递如下:
多个参数的时候,Feign接口的参数传递如下: