HTTP POST 请求超时(Read timed out)引起系统高负载排查

从你提供的错误日志截图来看,核心问题是:

HTTP POST 请求超时(Read timed out)
目标地址:http://192.168.95.80:6060/api/api/token
异常类型:ResourceAccessException → 嵌套异常是 SocketTimeoutException: Read timed out


🔍 问题详解

1. 发生了什么?

你的 Java 应用(通过 RestTemplate)尝试向内部服务 http://192.168.95.80:6060/api/api/token 发起一个 POST 请求,但在等待对方响应时超过了设定的读取超时时间,于是抛出异常。

简单说:

“我发了请求,但对方一直没回我数据,我等不及了,就报错了。”


2. 常见原因

✅ 网络或目标服务不可达/慢

✅ 超时设置太短

✅ 服务端资源不足

✅ 中间件或代理层问题


3. 关键线索


🛠️ 解决方案建议

✔️ 临时缓解:增加超时时间

如果你确定目标服务只是“慢”,不是“挂”,可以延长 RestTemplate 的超时设置:

// 示例:自定义 RestTemplate 设置超时
RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000);   // 连接超时 5 秒
factory.setReadTimeout(30000);     // 读取超时 30 秒(根据业务调整)
restTemplate.setRequestFactory(factory);

或者使用 HttpComponentsClientHttpRequestFactory(推荐用于生产环境):

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(30000);
RestTemplate restTemplate = new RestTemplate(factory);

💡 注意:不要盲目设得太大,否则会导致线程阻塞过久,影响系统吞吐量。


✔️ 根本解决:排查目标服务

登录到 192.168.95.80 服务器,检查:

  1. 服务是否运行?

    netstat -tlnp | grep 6060
    # 或
    ss -tlnp | grep 6060
    
  2. 查看该服务的日志(尤其是 /api/api/token 接口相关日志),看是否有报错、卡顿、死锁。

  3. 手动测试接口:

    curl -X POST http://192.168.95.80:6060/api/api/token \
         -H "Content-Type: application/json" \
         -d '{"your": "data"}' \
         --connect-timeout 5 \
         --max-time 30
    

    观察是否也能复现超时。

  4. 检查系统资源:

    top
    free -h
    iostat -x 1
    

✔️ 架构优化建议


📌 总结一句话

你的应用调用内网 token 服务时因对方响应太慢或未响应而超时,需要么调大超时时间应急,要么深入排查目标服务为何变慢或不可用。


✅ 下一步行动建议:

  1. 先手动 curl 测试目标接口能否通、多久返回。
  2. 查看目标服务日志和系统负载。
  3. 根据情况决定是改超时参数,还是修复服务端性能问题。
  4. 长期考虑加入缓存、熔断、监控等健壮性设计。

如需进一步分析,请提供:

我可以帮你定制具体解决方案。


Revision #1
Created 11 March 2026 07:11:16 by Admin
Updated 11 March 2026 07:11:59 by Admin