之前写过一篇使用spring boot来整合OpenFeign来实现微服务模块之间的相互调用,但那只是OpenFeign最基本的使用方式了,今天我们就来讲点高级货;
之前的文章:
spring boot整合openfeign实现两个微服务之间的调用。_springboot微服务之间的调用-CSDN博客
1、超时控制:
OpenFeign默认的超时时间为60秒,如果服务调用时间超时就会报错。我们可以在配置文件中修改OpenFeign的超时时间;
有两种修改方式:全局配置和指定配置;
全局配置:这个模块掉任何一个微服务模块的超时时间都为指定的值;
spring:
cloud:
openfeign:
client:
config:
default:
connect-timeout: 5000 #链接超时时间
read-timeout: 5000 #读取超时时间
指定配置:调用单个模块的配置超时时间(如order订单配置,这里写nacos注册中心的服务名称)
spring:
cloud:
openfeign:
client:
config:
order:
connect-timeout: 5000 #链接超时时间
read-timeout: 5000 #读取超时时间
这两种配置可以共存。起冲突时,以指定配置为准;
2、重试机制
openfeign的重试机制默认是关闭的,如果要使用的话需要我们手动去打开;
@Configuration
public class FeignConfig {
@Bean
public Retryer myRetryer() {
// 最大请求次数为3次(默认一次加重试两次),初始间隔时间为100ms,重试间最大时间间隔为1s
return new Retryer
.Default(100, 1,3);
}
}
3、性能优化 HttpClient5替换
openFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,由于默认HttpURLConnection
没有连接池、性能和效率比较低。可以使用Apache 的 HttpClient5替换openFeign默认使用的HttpURLConnection,来提高性能;
在api模块加上HttpClient5的依赖:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hc5</artifactId>
<version>13.1</version>
</dependency>
在yml文件中开启HttpClient5的替换;
spring:
cloud:
openfeign:
httpclient:
hc5:
enabled: true
4、openFeign的日志打印
openFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解openFeign中Http请求的细节。
openFeign有四种日志级别:
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
配置日志bean:
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
配置yml文件:
logging.level + 含有@FeignClient注解的完整带包名的接口名+日志级别
# feign日志以什么级别监控哪个接口
logging:
level:
com:
zq:
api:
user:
LoginOpenfeign: debug
现在重新启动user模块,就可以看到openFeign的日志输出了。
在项目启动时,OpenFeign 会根据接口定义生成代理对象。当你调用接口方法时,实际上是通过代理对象发送 HTTP 请求到远程服务,获取结果后再返回。
5、feign拦截器, 在feign请求发出之前,加入一些操作
@Component
public class FeignInterceptor implements RequestInterceptor {
// 为 Feign 的 RCP调用,可以进行多种操作。例如:将用户信息加入到请求头中
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("userId", "100");
}
}
这样,即使是在内部调用,也可以通过请求头来传递一些信息。
在相应的feign接口:
@FeignClient(value = "order", //服务名称
configuration = FeignInterceptor.class) //配置拦截器
public interface LoginOpenfeign {
@RequestMapping("/order/getOrderInfo")
String getConfig(@RequestHeader("userId") String userId);
}