问题复现
最近使用 websocket 技术开发了一个反向代理客户端,要求实现如下功能
- 客户端安装代理客户端,禁止开放端口,由服务端开放端口
- 客户端主动连接服务端,并保持心跳连接,当心跳中断或者断连时,重新与服务端建立连接
- 当客户端连接到服务端后,服务端随时发送请求给客户端
开发和测试环境都没有发生问题,当在客户那边使用时,客户开启了140个客户端连接,由于心跳检测和重连逻辑写的有问题,重连后不会关闭之前的连接,保留旧连接。导致与服务端的连接越来越多,最后连接激增到9千导致其他的 tcp 请求进入不到 tomcat。
由于 SpringBoot 2.2.25.RELEASE
tomcat 默认的最大连接数为 8192
,从而造成阻塞,导致页面请求超时。
tomcat 默认最大连接数
端口连接数
[root@curry platform]# netstat -na | grep 12345 | wc -l
9007
解决办法
1、修改产生问题的代码
2、修改服务端配置文件,将 max-connections 最大连接数设置成1万,暂时解决问题
server:
servlet:
context-path: /
tomcat:
max-connections: 10000
3、使用 jetty 替换默认 tomcat
, 强烈推荐
修改 pom 文件,排除调 tomcat 容器
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-jetty:2.3.1.RELEASE'
implementation ("org.springframework.boot:spring-boot-starter-websocket:2.3.0.RELEASE") {
exclude module: "spring-boot-starter-tomcat"
}