千家信息网

如何在SpringBoot中内嵌Tomcat并发容量

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"如何在SpringBoot中内嵌Tomcat并发容量"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何在SpringBoot中内嵌Tomca
千家信息网最后更新 2026年10月31日如何在SpringBoot中内嵌Tomcat并发容量

这篇文章主要介绍"如何在SpringBoot中内嵌Tomcat并发容量"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何在SpringBoot中内嵌Tomcat并发容量"文章能帮助大家解决问题。

发现并发容器问题

对单接口进行6000线程压测,每个线程请求5次,线程在5秒内创建完毕,当进行一半的时候,已经出现了请求响应时间过大及其错误率达到了43%。这个并发容量对于配置比较好点的服务器相对来说有点弱。

深入SpringBoot底层了解原因

在SpringBoot官方文档中提到了关于元数据的配置

可以看到,关于我们最常用的设置项目的端口的默认配置就在其中。

默认内嵌Tomcat配置

1、server.tomcat.accept-count:等待队列长度,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理,默认100。

2、server.tomcat.max-connections:最大可被连接数,默认10000

3、server.tomcat.max-threads:最大工作线程数,默认200,

4、server.tomcat.min-spare-threads:最小工作线程数,初始化分配线程数,默认10

默认配置下,连接超过10000后会出现拒绝连接情况

默认配置下,触发的请求超过200+100后拒绝处理(最大工作线程数+等待队列长度)

这些元数据Spring当然提供了外部配置功能

#更改内嵌tomcat参数server.port=8080## 等待队列长度,默认100。server.tomcat.accept-count=1000## 最大工作线程数,默认200。(4核8g内存,线程数经验值800,操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。)server.tomcat.max-threads=800## 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)server.tomcat.min-spare-threads=100

SpringBoot内置Tomcat,在默认设置中,Tomcat的最大线程数是200,最大连接数是10000。支持的并发量是指连接数,200个线程如何处理10000条连接的?

目前Tomcat有三种处理连接的模式,一种是BIO,一个线程只处理一个连接,另一种就是NIO,一个线程处理多个连接。由于HTTP请求不会太耗时,而且多个连接一般不会同时来消息,所以一个线程处理多个连接没有太大问题。

还有一种是apr模式,后续会详细介绍一下tomcat的这三种模式,这里不做深入讨论。

Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:

Starting ProtocolHandler ["http-bio-8080"]Starting ProtocolHandler ["http-nio-8080"]Starting ProtocolHandler ["http-apr-8080"]

默认值可以在spring-boot-autoconfigure-版本号.jar(比如:spring-boot-autoconfigure-2.1.0.RELEASE) 包中看到,解压反编译/web/ServerProperties.class文件就可以看到默认配置。

定制化内嵌Tomcat开发

关于KeepAlive

在使用Jmeter的Http请求中默认是开启KeepAlive的

Http的KeepAlive请求为当我们的客户端向我们的服务器发送Http请求的时候,若带上了KeepAlive的请求头,则表明我们的Http客户端希望跟服务端之间建立一个KeepAlive的连接,这个连接对应的用处就是说,向我们的服务端发送完对应的响应之后,我们的服务端不要立马断开连接,而是等待尝试复用连接。

此解决方案是用来解决Http的一个响应,无状态,每次都要断开连接,新建连接所带来的一个耗时问题。

但如果说我们每个网页请求打开之后都跟服务端保持一个长连接,那我们服务端的连接数很快就会被用完了,因此再最早的Http1.0的时候是没有设计KeepAlive的请求的,但是现在的Http1.1加上KeepAlive请求,目的就是越来越多的移动端的设备,甚至于一些很复杂的网页交互,需要在用户浏览的过程当中,频繁的向服务端发送请求,因此,建立一个KeepAlive连接,并非为了压测的目的,而是真正的在应用场景上是有一些性能的好处的,无论是客户端还是服务端,在做一些网络通信的交互上面,无需每次都新建连接,断开连接,耗费Tcp/Ip建连的时间,而仅仅只需要发送数据即可。

但是这样的设计也会带来一些问题,如果说我们的服务端对KeepAlive的操作没有做任何限制 1.连接不做任何操作,不做任何响应,那这条连接对服务端来说就是一条费连接 2.有一些攻击者恶意利用KeepAlive连接向我们的服务端发送DDOS的攻击,那服务端对应的连接只会成为攻击者攻击的后门,因此,为了安全,我们需要定制化Tomcat开发

配置

1、KeepAliveTimeOut:多少毫秒后客户端不响应则断开KeepAlive

2、maxKeepAliveRequests:多少次请求后KeepAlive断开失效

在SpringBoot官方文档中提到了对内嵌容器的配置

//当spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把bean加载进spring容器@Configurationpublic class WebServerConfiguration implements WebServerFactoryCustomizer {@Overridepublic void customize(ConfigurableWebServerFactory factory) {  //使用对应工厂类提供给我们的接口定制化我们的tomcat connector  ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {    @Override    public void customize(Connector connector) {      Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler();      //定制KeepAliveTimeout,设置30秒内没有请求则服务器自动断开keepalive连接      protocol.setKeepAliveTimeout(30000);      //当客户端发送超过10000个请求则自动断开keepalive连接      protocol.setMaxKeepAliveRequests(10000);    }  });}}

关于"如何在SpringBoot中内嵌Tomcat并发容量"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

线程 服务 配置 最大 处理 客户 客户端 问题 队列 工作 容量 容器 就是 时候 模式 攻击 多个 数据 服务器 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海喔噻互联网科技有限公司 关于新基建和互联网科技 麻工互联网科技 互联网 科技 青岛互联网科技公司 互联网金融科技平台 电子科技大学互联网 互联网科技生活的内容 成都仁贤领冠互联网科技有限公司 阿里巴巴算科技企业还是互联网 互联网科技与管理 智腾互联网科技有限公司 中国航天科技大学国际工业互联网 互联网公司黑科技创始人 山东子淼互联网科技有限公司 高科技互联网套路 上海万顺科技互联网有限公司招聘 玉溪新华互联网科技怎么选 如何强化互联网金融科技 互联网 科技节活动 微视频大赛 新华互联网科技 互联网科技金融 鑫亿盛互联网科技 未来的互联网科技 互联网 视角下的科技创新 上海电发互联网科技有限公司 成都铂石互联网科技做什么的 互联网科技大奖都有哪些公司 互联网科技研发水平 第三届互联网大会安防黑科技
0