OpenFeign服务调用与负载均衡
目录
- 介绍
- 使用
- 高级特性
- 超时控制
- 重试机制
- 默认HttpClient修改
- 请求/响应报文压缩
- 日志打印功能
- 相关文献
介绍
官网说明:
Feign 是一个声明式 Web 服务客户端。它使编写 Web 服务客户端变得更加容易。要使用 Feign,请创建一个接口并对其进行注释。它具有可插拔的注释支持,包括 Feign 注释和 JAX-RS 注释。Feign 还支持可插拔编码器和解码器。Spring Cloud 增加了对 Spring MVC 注解的支持,以及使用 Spring Web 中默认使用的注 HttpMessageConverters 解。Spring Cloud 集成了 Eureka、Spring Cloud CircuitBreaker 以及 Spring Cloud LoadBalancer,以便在使用 Feign 时提供负载均衡的 http 客户端。
使用
创建一个springboot项目,主启动类加注解**@EnableFeignClients**,开启OpenFeign功能并激活
在提供接口的项目模块中引入openfeign依赖,新建接口,并在接口类中配置@FeignClient注解,@FeignClient(“xxxx”)的xxx是consul或者是其他服务注册中间件中的服务名。
高级特性
超时控制
我们可以在默认客户端和命名客户端上配置超时。OpenFeign 使用两个超时参数:
- connectTimeout 防止由于服务器处理时间过长而阻止调用方。
- readTimeout 从建立连接时开始应用,并在返回响应时间过长时触发。
OpenFeign不配置超时时间的话默认等待60秒,超时后会报错
如何自定义配置超时时间如下:
feignName 在此示例中, 是@FeignClient value 它也与 @FeignClient name 和 @FeignClient contextId 别名。在负载均衡方案中,它还对 serviceId 应于将用于检索实例的服务器应用。decoders、retryer 和其他类的指定类必须在 Spring 上下文中具有 bean 或具有默认构造函数。
配置可分全局配置和指定配置,如果一个接口中存在调用多个微服务的接口,每个微服务的请求时间不同,根据业务不同需要特色化配置,就需要用到指定超时时间配置。
全局配置:
spring:cloud:openfeign:client:config:default:connectTimeout: 5000readTimeout: 5000loggerLevel: basic
指定配置
spring:cloud:openfeign:client:config:your-server-name:connectTimeout: 5000readTimeout: 5000loggerLevel: basic
区别在于config:下级配置名称不同
如果更喜欢使用配置属性来配置所有 @FeignClient ,则可以使用 default 假名创建配置属性,这样是所有的服务接口统一用一套超时时间,如果yml配置文件中同时存在defalut和指定服务名,指定服务名的超时时间是独立的,其他服务是默认,指定服务名的优先级更高。
重试机制
在模块中新增配置类
默认HttpClient修改
OpenFeign中http client如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,
由于默认HpURLConnection没有连接池、性能和效率比较低,如果采用默认,性能上不是最优解,所以要改成http5,且官方回应也是从 Spring Cloud OpenFeign 4 开始,不再支持 Feign Apache HttpClient 4。我们建议改用 Apache HttpClient 5。
引入依赖
<1--httpclient5-->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId>
<version>5.3</version>
</dependency>
<1--feign-hc5-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hc5</artifactId>
<version>13.1</version>
</dependency>
修改yml
spring:cloud:openfeign:httpclient:hc5:anabled: true
修改成功后,日志发生改变
请求/响应报文压缩
对请求和响应进行GZIP压缩
Spring Cloud OpenFeign支持对谐求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的两个参数设置,就能开启请求与相应的压缩功能:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true
细粒度化设置对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型并设置了请求压缩的大小下限,只有超过这个大小的请求才会进行压缩:
## 开启请求压缩
spring.cloud.openfeign.compression.request.enabled=true
## 触发压缩数据类型
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json
## 最小触发压缩的大小
spring.cloud.openfeign.compression.request.min-request-size=2048
日志打印功能
Feign 提供了日志打印功能,对Feign接口的调用情况进行监控和输出
日志级别:
- NONE ,无日志记录 (DEFAULT)。
- BASIC ,仅记录请求方式和 URL 以及响应状态代码和执行时间。
- HEADERS ,记录基本信息以及请求和响应标头。
- FULL ,记录请求和响应的标头、正文和元数据。
新建配置类,对Feign日志全面打印
@Configuration
public class FooConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}
Feign 会为创建的每个 Feign 客户端创建一个记录器。
默认情况下,记录器的名称是用于创建 Feign 客户端的接口的完整类名。
例如我要监控我的UserClient接口的日志,UserClient类在com.demo.apis包下,那么yml配置如下:
logging:level:com:demo:apis:UserClient: DEBUG
相关文献
Spring Cloud OpenFeign官网链接:https://docs.spring.io/spring-cloud-openfeign/docs/4.0.7-SNAPSHOT/reference/html/#spring-cloud-feign
Spring Cloud OpenFeign properties属性明细链接:https://docs.spring.io/spring-cloud-openfeign/docs/4.0.7-SNAPSHOT/reference/html/appendix.html
Github OpenFeign:https://github.com/OpenFeign/feign