Tomcat部署网关与后端Web应用间java.net.SocketException: Connection reset求助
结合你遇到的这个场景——网关部署在负载均衡的服务器1、2上,作为Tomcat应用和同样做了负载均衡的服务器3、4上的后端服务通信,高并发时段或后端连核心系统失败时,网关报java.net.SocketException: Connection reset,偶尔客户端能看到,后端服务初期无异常,严重时直接挂起需要重启,我整理了几个实际排查中有效的思路,咱们一步步来拆解:
一、先从TCP连接与网络层面入手
Connection reset本质是TCP连接被某一端强制关闭了,先搞清楚是谁发起的关闭:
- 抓包定位发起方:在网关(服务器1、2)和后端服务(服务器3、4)上用
tcpdump抓包,比如执行sudo tcpdump host <对方IP> and port <服务端口> -w reset.pcap,出现错误后用Wireshark分析,看FIN/RST包是从哪台机器发出来的。如果是后端负载均衡器(服务器3、4的LB)发的,大概率是LB的超时配置太短;如果是后端服务进程发的但没日志,可能是进程内部有静默的连接处理失败。 - 检查TCP内核参数:重点看
keepalive相关参数(tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes),如果连接长时间闲置被内核自动回收,会触发reset。另外高并发下,tcp_tw_reuse、tcp_tw_recycle这些TIME_WAIT回收参数是否合理,TIME_WAIT堆积会导致新连接创建失败。 - 验证后端负载均衡的健康检查:服务器3、4的LB对后端服务的健康检查规则是否合理?比如健康检查的超时时间太短,当后端服务因为核心系统连接卡顿暂时响应慢时,LB可能误判服务不可用,直接重置网关过来的连接。
二、排查连接池配置是否匹配高并发场景
不管是网关的入站/出站连接池,还是后端服务的入站/核心系统连接池,配置不合理都会引发这类问题:
- 网关侧的HTTP客户端连接池:如果用的是Tomcat自带的连接器,检查
maxConnections、maxThreads、connectionTimeout配置;如果是自定义的HTTP客户端(比如OkHttp、Apache HttpClient),看连接池的最大连接数、最大空闲时间、连接超时是否设置合理。高并发下连接池耗尽,或者连接被池回收但网关还在复用,就会出现reset。 - 后端服务的Tomcat连接配置:检查
acceptCount(等待队列大小)、maxThreads(处理线程数)、connectionTimeout是否足够。当后端服务因为核心系统连接失败阻塞线程,线程池耗尽后,新的连接请求会被Tomcat直接拒绝,导致网关收到reset。 - 后端服务连核心系统的出站连接池:有没有设置合理的超时时间?比如调用核心系统的请求如果没设connect timeout和read timeout,线程会一直阻塞,直到被内核强制中断,最终导致后端服务线程池被占满,服务挂起。
三、深挖后端服务挂起的根源
后端服务挂起大概率是核心系统连接失败引发的连锁反应,重点排查线程和资源瓶颈:
- 抓取线程dump定位阻塞点:当服务挂起时,立刻执行
jstack <后端服务PID>生成线程dump,看是否有大量线程处于BLOCKED或者WAITING状态,尤其是和核心系统通信相关的线程。比如是否有线程因为获取锁阻塞,或者一直等待核心系统的响应。 - 监控内存与GC情况:用
jstat -gcutil <PID> 1000实时查看GC状态,或者用JConsole、VisualVM等工具监控内存占用。如果核心系统连接失败导致大量请求堆积,产生大量临时对象,会引发频繁Full GC,甚至OOM,最终导致服务挂起。 - 检查核心系统调用的重试逻辑:有没有不合理的重试?比如核心系统连接失败后无限制重试,导致后端服务线程被大量占用,无法处理新的网关请求。
四、验证负载均衡器的流量分配配置
负载均衡的规则如果不匹配业务场景,也会放大问题:
- 检查网关侧LB的流量分配:服务器1、2的LB是轮询还是加权?如果某台网关的连接数过高,会导致后端服务的连接压力不均,局部出现连接重置。
- 检查后端侧LB的会话保持:如果开启了会话保持,当某台后端服务出现问题时,流量会一直打到这台服务,导致问题快速恶化。另外,LB的连接超时时间是否和后端服务的连接超时匹配?如果LB的超时比后端服务短,LB会先断开连接,网关侧就会收到reset。
五、补充日志与监控,快速定位问题
最后,完善日志和监控能帮你更快定位根因:
- 增强日志颗粒度:在网关侧记录每个请求的连接ID、目标后端服务地址;在后端服务侧记录每个请求的入站连接信息、核心系统调用的耗时和状态。这样出现reset时,可以精准定位到对应的请求和服务实例。
- 增加关键监控指标:比如网关到后端服务的连接数、错误率;后端服务的线程池使用率、核心系统调用的成功率和耗时;负载均衡器的健康状态、连接数。这些指标能帮你在高并发或核心系统故障时,快速找到瓶颈点。
内容的提问来源于stack exchange,提问作者Krithika Vittal
相关产品推荐
相关产品推荐

