记录一次接口超时问题排查
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超时时间配置导致的,本文记录了分析的步骤,后续遇到相关问题,可以有个思路去分析排查
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库