SpringCloud中的OpenFeign的超时控制和日志增强
为什么要学这个?你不想面试的时候多装两个逼多拿两千块钱?
先回顾一下我们之前OpenFeign的基本使用SpringCloud中的OpenFeign以及与Feign的区别。
我们现在衍生一下,在实际生产环境中,服务提供者可能会出现很多问题,网络环境,数据库交互等,服务提供者返回数据的时间可能会很长。。或者说有一个服务接口,它是一个长流程接口,可能要等待3s,5s甚至更长时间才能返回数据。那么这个时候,我们的服务提供者怎么办呢? 如果服务方发生不可预知的情况一直没有返回数据,消费端要一直挂起等待吗?
1.这里我们学习一下OpenFeign的超时控制
案例我们就继续上个文章里面的代码来掩饰SpringCloud中的OpenFeign以及与Feign的区别。
这是服务提供端,有这样一个接口,这个接口我们手动的让它等待3S再返回!模拟服务长时间不返回的场景。
@GetMapping("/testOpenFeign01")
public String testOpenFeign01()throws InterruptedException{
Thread.sleep(3000);
return deptService.testOpenFeign01();
}
这里是消费端,FeignClient接口代码,我们消费端将会调用testOpenFeign01()方法,这样它就会去访问到服务端的"/testOpenFeign01"接口,也就是上面贴出来的代码。
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface MyTestOpenFeign01 {
@GetMapping("/testOpenFeign01")
String testOpenFeign01();
@GetMapping("/testOpenFeign02")
String testOpenFeign02();
}
现在测试一下,用浏览器给消费端发请求,会发生什么?
报错求了! 看上面我红线框起来的信息。Read timed out。超时了。
为什么会这样呢?按理来说,浏览器应该会转圈等待3s然后返回正确的信息,但这里维斯很么会报错呢?
OpenFeign默认超时时间是1S
哦豁,那怎么办呢? 假如现在有一个服务,我们知道它的处理过程很复杂,要5S中才能返回结果,那该怎么办呢?
为了避免这样的情况,我们可以手动的设置OpenFeign的超时时间。
去到消费端的配置文件加下面这段配置
#设置OpenFeign的超时时间(应该OpenFeign默认支持Ribbon,所以超时控制由Ribbon实现)
ribbon:
#指建立连接所用的时间,适用网络正常情况下,两端连接所用时间
ReadTimeout: 5000
#指建立连接后从服务器读到数据所用的时间
ConnectTimeout: 5000
2.OpenFeign日志增强功能(日志打印)
OpenFeign提供了这样的功能,而且可以通过调节日志级别,从而了解OpenFeign中Http请求的细节。 换句话说就是对OpenFeign调用情况的监控和输出!
OPenFeign的日志级别
NONE:默认值,不打日志
BASIC:记录请求方法,URL,响应状态码和请求时间
HEADERS : 在BASIC的基础上,还有请求头和响应头的信息
FULL:包含以上所有,还有请求和响应的正文
都会在底层把这两个接口解析成方法元数据,再通过动态代理生成接口的代理,真正发请求的是代理类!
项目启动的时候,会用LoadBalancerFeignClient注册一个feign.Client到ioc容器中。
在配置类中新增这样一个Bean。级别是FULL
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
然后去到消费端的配置文件处加上以下配置
logging:
level:
# feign以什么级别的日志去监听哪个接口,这里的接口就是@FeignClient修饰的接口
com.common.springcloud.OpenFeign.MyTestOpenFeign01:debug
测试一下,日志打印成功。。。。
好了 基本已经讲完,欢迎大家评论区指出不足,一起学习进步!
大家看完了点个赞,码字不容易啊。。。