var f = new SimpleClientHttpRequestFactory();
f.setConnectTimeout(1000);
f.setReadTimeout(3000);
return new RestTemplate(f);

下游一个接口挂了之后,上游所有接口跟着无响应,线程 dump 里几十个线程都停在 socketRead0 上不动,重启能好一阵。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,RestTemplate 用默认工厂时连接和读取都没有超时,对方不返回就一直等,Web 容器线程被逐个占满,连健康检查都排不进去,重启只是暂时缓解。

「RestTemplate 默认超时」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:换掉默认工厂,把连接超时和读取超时显式设上;读取超时按下游的 P99 来给,别设成一直无限等下去;加上连接池复用连接,避免每次请求都重新握手一次。

改完只确认一件事:下游挂掉时上游接口 3 秒内返回降级结果,线程池不再被占满。

作者 9823189