记一次线上SpringCloud Feign请求服务超时异常排查问题

 更新时间:2022年01月13日 15:17:05   作者:小邓学长  
这篇文章主要介绍了记一次线上SpringCloud Feign请求服务超时异常排查问题,本项目与下游项目均注册在Eureka上面,对这个1秒就超时感到很迷惑,于是开始查阅底层源码之旅。需要的朋友可以参考下

由于近期线上单量暴涨,第三方反馈部分工单业务存在查询处理失败现象,经排查是当前系统通过FeignClient调用下游系统出现部分超时失败(异常代码贴在下方)。

Caused by: feign.RetryableException: Read timed out executing POST http://xxxx
        at feign.FeignException.errorExecuting(FeignException.java:84) ~[feign-core-10.1.0.jar!/:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113) ~[feign-core-10.1.0.jar!/:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78) ~[feign-core-10.1.0.jar!/:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-10.1.0.jar!/:na]
        at com.sun.proxy.$Proxy141.creditReportConvert(Unknown Source) ~[na:na]
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_121]
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_121]
        at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_121]
        at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_121]
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) ~[na:1.8.0_121]
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) ~[na:1.8.0_121]
        at java.io.BufferedInputStream.read(BufferedInputStream.java:345) ~[na:1.8.0_121]
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704) ~[na:1.8.0_121]
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647) ~[na:1.8.0_121]
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569) ~[na:1.8.0_121]
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) ~[na:1.8.0_121]
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) ~[na:1.8.0_121]
        at feign.Client$Default.convertResponse(Client.java:143) ~[feign-core-10.1.0.jar!/:na]
        at feign.Client$Default.execute(Client.java:68) ~[feign-core-10.1.0.jar!/:na]
        at org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.execute(FeignLoadBalancer.java:93) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar!/:2.1.1.RELEASE]
        at org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.execute(FeignLoadBalancer.java:56) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar!/:2.1.1.RELEASE]
        at com.netflix.client.AbstractLoadBalancerAwareClient$1.call(AbstractLoadBalancerAwareClient.java:104) ~[ribbon-loadbalancer-2.3.0.jar!/:2.3.0]
        at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:303) ~[ribbon-loadbalancer-2.3.0.jar!/:2.3.0]

通过系统慢请求捕捉拦截,发现当前请求仅耗时1031毫秒,就触发Read timed out超时错误,本项目与下游项目均注册在Eureka上面,对这个1秒就超时感到很迷惑,于是开始查阅底层源码之旅。

通过跟踪代码可以在feign.Request内部类Options构造函数默认配置连接超时10秒,读超时60秒。然而本次调用请求仅耗时1秒左右就被掐断连接提示超时错误,初步判断默认这个超时配置并未生效导致。

写到这,咱们先回顾下Feign链路完整调用流程步骤。

可以看出Feign调用分为Hystrix、Ribbon两层,一般高版本的Hystrix默认是关闭的(本项目Hystrix默认是关闭的,那么现在需要去分析Ribbon层调用配置信息)

可以看到RibbonClientConfiguration默认配置的读超时和连接超时时间1000毫秒=1秒,在没有配置超时情况下当前这个超时是符合本次调用超时错误触发。

我们可以在FeignLoadBalancer的execute方法中看到当IClientConfig为空的时候进行覆盖超时时间,默认是取Ribbon的超时时间,并不是Feign Options默认的超时时间。

public FeignLoadBalancer(ILoadBalancer lb, IClientConfig clientConfig,
            ServerIntrospector serverIntrospector) {
        super(lb, clientConfig);
        this.setRetryHandler(RetryHandler.DEFAULT);
        this.clientConfig = clientConfig;
        this.ribbon = RibbonProperties.from(clientConfig);
        RibbonProperties ribbon = this.ribbon;
        this.connectTimeout = ribbon.getConnectTimeout();
        this.readTimeout = ribbon.getReadTimeout();
        this.serverIntrospector = serverIntrospector;
    }

如果application.properties文件中有配置超时时间,则使用配置的超时时间。否则是取Ribbon默认的超时时间,也就是网上所说的Feign调用服务的默认时长是1秒钟,也就是如果超过1秒没连接上或者超过1秒没响应,那么会相应的报错。

实际业务中服务如果响应时间超过1秒,咱们可以按照实际响应情况给予配置相对应的超时时间,下面分别贴出properties和yml版本的配置

#properties版本
feign.client.config.default.connectTimeout=60000
feign.client.config.default.readTimeout=60000
#yml版本
feign:
  client:
    config:
      default:
        connectTimeout: 60000
        readTimeout: 60000

到此这篇关于记一次线上SpringCloud Feign请求服务超时异常排查的文章就介绍到这了,更多相关SpringCloud Feign请求服务超时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot配置https实操方法

    SpringBoot配置https实操方法

    在本篇文章里小编给大家整理的是关于SpringBoot配置https实操方法以及相关知识点,需要的朋友们参考下。
    2019-11-11
  • 在Spring中实现异步处理的步骤和代码演示

    在Spring中实现异步处理的步骤和代码演示

    在Spring中实现异步处理通常涉及到@Async注解,通过步骤和代码演示,可以在Spring应用程序中实现异步处理,记住要根据你的应用程序的实际需求来调整线程池和异步方法的设计,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Java 不使用第三方变量交换两个变量值的四种方法详解

    Java 不使用第三方变量交换两个变量值的四种方法详解

    这篇文章主要介绍了四种不使用第三方变量交换两个变量值的方法。文中对于四种方法进行了详细的分析,需要的小伙伴们可以跟随小编一起学习一下
    2021-12-12
  • SpringMVC基于阻塞队列LinkedBlockingQueue的同步长轮询功能实现详解

    SpringMVC基于阻塞队列LinkedBlockingQueue的同步长轮询功能实现详解

    这篇文章主要介绍了SpringMVC基于阻塞队列LinkedBlockingQueue的同步长轮询功能实现详解,本文介绍的也是生产者消费者的一种实现,生产者不必是一个始终在执行的线程,它可以是一个接口,接受客户端的请求,向队列中插入消息,需要的朋友可以参考下
    2023-07-07
  • java稀疏数组的示例代码

    java稀疏数组的示例代码

    这篇文章主要介绍了java稀疏数组,稀疏数组,记录一共有几行几列,有多少个不同值,把具有不同值的元素和行里了及值记录在一个小规模的数组中,从而缩小程序的规模,对java稀疏数组相关知识感兴趣的朋友一起看看吧
    2022-07-07
  • Java自定义equals产生的问题分析

    Java自定义equals产生的问题分析

    这篇文章主要介绍了Java自定义equals时super.equals带来的问题分析,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路
    2023-01-01
  • 关于springboot集成swagger3时spring-plugin-core报错的问题

    关于springboot集成swagger3时spring-plugin-core报错的问题

    这篇文章主要介绍了关于springboot集成swagger3时spring-plugin-core报错的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Springboot @Value使用代码实例

    Springboot @Value使用代码实例

    这篇文章主要介绍了Springboot @Value使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Spring Cache实现缓存技术

    Spring Cache实现缓存技术

    在面对公司缓存技术混乱时,张三基于Spring框架自研缓存解决方案,展现了他的专业技术能力和积极工作态度,他通过问题诊断、技术选型、编码测试、文档编写和部署监控等一系列步骤,确保了新缓存系统的功能正确性和性能稳定性
    2024-10-10
  • 浅谈Java设计模式之七大设计原则

    浅谈Java设计模式之七大设计原则

    在此之前,我已经写过很多篇关于设计模式的文章.但都比较草草的理解和简单的实现,并未深入理解.为了更加深入感受Java设计的魅力,编程的艺术,今天进行了七大设计原则的学习理解,后续进行23种设计模式的深入学习探究,需要的朋友可以参考下
    2021-05-05

最新评论