记录一次接口超时问题排查

1、问题描述

前端调用一个耗时较长的后端接口,预估时间需要一分半,每次在1分钟时,会自动断开,提示超时。

2、问题背景

前端调用接口,会分别经历Nginx、Gateway到微服务A,服务A经过逻辑处理后,会通过FeignClient调用微服务B的接口。

3、问题分析

初步分析可以知道,肯定是在上面的请求链路中的某一环超时导致的,服务A中的日志显示IOException,如下图:

  • 这种异常一般是服务端在向客户端写数据时,客户端主动中止了连接。起初怀疑是服务A调用服务B时,由于FeignClient的超时设置不合理导致的,修改了一下FeignClient的超时配置,如下:
feign:
client:
config:
default:
connectTimeout: 10
readTimeout: 120

注:connectTimeout的默认值为10,单位是秒,表示请求连接上的超时时间;readTimeou的默认是60,单位是秒,表示请求处理到返回的超时时间。

default对所有的服务都生效,如果想要对指定的服务配置,可以将default换成指定服务的contextId,如下图:

修改之后,发现还是1分钟超时,怀疑是配置没有生效,代码断点查看,断点位置如下:

结论:断点排查服务的配置,发现配置是读取到的,修改此处的超时时间配置,确实也会影响,但是错误提示和当前现象不一致,所以不是FeignClient的配置导致的超时

  • 网上查询可能导致超时的配置,有提到服务A本身的配置存在问题,是如下配置:
spring:
mvc:
async:
request-timeout: 120000
server:
servlet:
session:
timeout: 1800

request-timeout表示请求的超时时间,默认值是-1,即不限制超时时间,单位是毫秒;session.timeout表示session过期配置,默认值是30分钟,单位是秒。

结论:最开始这两个参数没有配置,正常应该不会影响超时,因此不是此处的超时导致的

  • 怀疑有可能是Gateway配置导致的超时,修改尝试了一下,并未起作用,此处简单记录一下网关超时设置的配置,全局生效的配置如下:
spring:
cloud:
gateway:
httpclient:
connect-timeout: 5000
response-timeout: 5s

其中response-timeout(单位是秒)默认是不限制,即响应超时不限制,connect-timeout(单位是毫秒)默认是45秒,即超过45秒还没有连接上,则算作超时,返回错误。

也可以针对指定路由配置超时时间,示例如下:

spring:
cloud:
gateway:
routes:
- id: test
uri: lb://test
predicates:
- Path=/api/**
metadata:
response-timeout: 1000
connect-timeout: 1000

其中respose-timeout和connect-timeout的单位均是毫秒。网关配置超时时间的目的,大都是为了防止请求阻塞时而一直等待,通过减小超时时间,而快速返回错误。

  • 最终定位问题到Nginx上,Nginx配置的默认响应超时时间为一分钟,Nginx中关于超时的配置特别多,本处给出导致问题的配置,针对请求URL配置超时时间:
server{
location /api {
proxy_read_timeout 120;
}
}

增加了如上面的配置,单位是秒,表示请求响应时间

4、结论

问题最终是由于Nginx超时时间配置导致的,本文记录了分析的步骤,后续遇到相关问题,可以有个思路去分析排查

posted @   浪迹天涯的派大星  阅读(228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示