Springboot 应用 loopbackconnector 分析
自连接现象
客户反馈服务器上应用启动时无端开启一些 TCP 端口监听,占用系统资源,造成浪费。本着不放过任何一个问题的原则,使用 netstat 查看确实存在一些 tcp 链路,并且这些链路都是 loopback,但没有端口监听,说明是连接建立后关闭了端口监听。
JFR、JMC 和应用 capture 分析
1.设置 JFR 配置文件
从 JDK 目录下 JRE 中 lib/jfr 中复制 default.jfc,对配置文件进行修改,增加 socket 相关事件记录,如上图所示
2.启动应用获取 JFR
java -XX:+UnlockCommercialFeatures -XX:StartFlightRecording=duration=90s,filename=myrecording.jfr,settings=D:\taskDemo\JavaTaskDemo\javabase\springbootdemo\target\default.jfc -jar .\springbootdemo-0.0.1-SNAPSHOT.jar
通过指定自定义配置文件,settings=xxx.jfc,生成 myrecording.jfr 文件。
3.使用 JMC 对 JFR 文件进行分析
启动 JMC 软件,打开 JFR 的 myrecording.jfr 文件进行事件分析,发现应用启动时确实存在 socket event 中的数据发送,数据有 16 个字节,无法看到数据内容
同时调用堆栈展示如下:
4.wireshark 抓包分析
JFR 能够记录到链路数据发送长度,但无法得到链路发送的具体内容,于是使用 wireshark 进行数据抓包
应用启动时确实有 TCP 自连接建立并发送数据,但每次数据内容是随机的
源码分析
是谁在应用启动时进行 TCP 自连接并发送数据,Maven 下载依赖源码,进行源码分析。根据 JMC 中对堆栈的记录查找数据发送源码位置
源码中可以看出应用启动时进行了链路连接监测,发送和接收数据一致的情况下说明通信没有问题,若是数据不一致则一直进行验证,这就会造成很多自连接的情况出现