目录
什么是openfeign:
feign的处理流程:
openfeign超时控制:
Feign 超时控制概述
配置:
全局配置:
指定配置:
openfeign重试机制:
1. Feign 的重试机制
2. 方法一:启用 Feign 重试机制
3. 方法二: 自定义 Feign 重试机制
openfeign性能优化:
openfeign日志打印:
什么是openfeign:
openfeign是一个声明式的Web服务客户端,
只需创建一个Rest接口并在该接口上添加注解@FeignClient即可,
OpenFeign基本上就是当前微服务之间调用的事实标准
feign的处理流程:
- 微服务 A (
user-service
) 启动时会向 Consul 注册。 - 微服务 B 需要调用微服务 A,B 配置了 OpenFeign 和
@FeignClient(name = "user-service")
。 - B 在调用
UserServiceClient
接口的方法时,Feign 自动发起 HTTP 请求,使用 Consul 中注册的地址和端口去访问微服务 A。 - 如果微服务 A 崩溃或无法访问,Feign 可以配合 Hystrix 或其他容错机制来处理错误或熔断。
使用 Feign 和服务发现带来以下优势:
- 动态服务发现:无需手动管理服务地址,自动获取可用实例。
- 负载均衡:自动选择合适的服务实例进行调用。
- 简化代码:通过接口和注解的方式,减少 HTTP 请求的手动处理。
- 解耦和灵活扩展:服务间的调用变得更加松散耦合,易于维护和扩展。
- 容错和熔断机制:提供更高的容错能力,避免单点故障影响整体系统。
因此,Feign 并不是为了替代直接调用,而是为了解决微服务架构中的许多复杂问题,提供了一种更简洁、健壮和可扩展的服务调用方式。
openfeign超时控制:
超时控制是非常重要的,特别是当微服务间通信的延迟或不可用时,合理的超时设置能够帮助系统提高鲁棒性和性能。
Feign 超时控制概述
- 连接超时 (Connection Timeout):指的是 Feign 客户端在建立连接时的超时时间。如果在指定的时间内无法与远程服务建立连接,Feign 将抛出连接超时异常。
- 读取超时 (Read Timeout):指的是 Feign 客户端在成功建立连接后,等待从远程服务获取响应的超时时间。如果在指定时间内没有收到响应,Feign 将抛出读取超时异常。
配置:
全局配置:
spring:
cloud:
openfeign:
client:
config:
default:
#连接超时时间
connectTimeout: 3000
#读取超时时间
readTimeout: 3000
指定配置:
spring:
cloud:
openfeign:
client:
config:
cloud-payment-service:
#连接超时时间
connectTimeout: 5000
#读取超时时间
readTimeout: 5000
openfeign重试机制:
OpenFeign 默认并不启用重试机制,但可以通过与 Spring Cloud 提供的其他工具结合使用(如 Ribbon、Hystrix、Spring Cloud LoadBalancer)来实现重试机制。Feign 支持重试功能,但它需要进行一定的配置才能生效。下面是关于 OpenFeign 重试机制的详细介绍,包括如何启用和配置。
1. Feign 的重试机制
Feign 的重试机制用于在调用远程服务时发生故障时自动重新尝试请求。通常,重试机制用于临时的网络问题或服务短暂不可用的情况。Feign 默认是不启用重试的,但你可以通过配置启用它,并且可以控制重试的次数、间隔等。
2. 方法一:启用 Feign 重试机制
要启用 Feign 的重试机制,你需要在 application.properties
或 application.yml
配置文件中进行配置,或通过 Java 配置类进行更细粒度的控制。
在 application.yml
中启用重试机制:
feign:
retry:
enabled: true
client:
config:
default:
maxRetryAttempts: 3 # 最大重试次数
retryInterval: 1000 # 重试间隔,单位为毫秒
maxRetryInterval: 5000 # 最大重试间隔,单位为毫秒
3. 方法二: 自定义 Feign 重试机制
你可以通过实现自定义的重试机制来替换默认的行为。Feign 提供了一个 Retryer
接口,允许你自定义重试策略。你可以自定义重试间隔、最大重试次数等。
在 Feign 配置类中指定自定义的 Retryer
:
@Configuration
public class FeignConfig {@Beanpublic Retryer retryer() {return new Retryer.Default(1000, 5000, 3); // 1000ms 重试间隔,最多重试 3 次}
}
openfeign性能优化:
apache.httpcomponents.client5替换openfeign默认的HttpURLConnection:
1. 引入依赖:
<!-- httpclient5--> <dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.3</version> </dependency> <!-- feign-hc5--> <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hc5</artifactId><version>13.1</version> </dependency>
配置开启:
httpclient:
hc5:
enabled: true
#cloud-payment-service:
#connectTimeout: 4000 #连接超时时间
#readTimeout: 4000 #读取超时时间
openfeign请求回应压缩:
OpenFeign 支持通过 HTTP 请求和响应进行压缩,通常用于优化网络传输性能,尤其是当传输的数据量较大时。HTTP 请求和响应压缩是通过使用 Content-Encoding
和 Accept-Encoding
头来实现的。你可以通过配置 Feign 请求和响应的压缩方式,减少带宽使用,提高性能。
yml配置:
spring:cloud:openfeign:compression:request:enabled: truemin-request-size: 2048 #最小触发压缩的大小mime-types: text/xml,application/xml,application/json #触发压缩数据类型response:enabled: true
openfeign日志打印:
NONE:默认的,不显示任何日志;
在FeignConfig配置类当中,配置日志bean:
@BeanLogger.Level feignLogLevel(){return Logger.Level.FULL;}
在YML中开启日志的Feign客户端:
配置公式(三段):logging.level + 含有@FeignClient注解的完整带包名的接口名+debug
例如:
接口名为:PayFeignApi
那yml配置为:
# feign日志以什么级别监控哪个接口 logging:level:com:atguigu:cloud:apis:PayFeignApi: debug