返回顶部
首页 > 资讯 > 精选 >怎么在SpringBoot中内嵌Tomcat并发容量
  • 376
分享到

怎么在SpringBoot中内嵌Tomcat并发容量

2023-06-15 09:06:23 376人浏览 安东尼
摘要

怎么在SpringBoot中内嵌Tomcat并发容量?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。发现并发容器问题对单接口进行6000线程压测,每个线程请求5次,线程在5秒内创

怎么在SpringBoot中内嵌Tomcat并发容量?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

发现并发容器问题

怎么在SpringBoot中内嵌Tomcat并发容量

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

深入springBoot底层了解原因

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

怎么在SpringBoot中内嵌Tomcat并发容量

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

默认内嵌Tomcat配置

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

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

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

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文件就可以看到默认配置。

怎么在SpringBoot中内嵌Tomcat并发容量

定制化内嵌Tomcat开发

怎么在SpringBoot中内嵌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开发

配置

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

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

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

怎么在SpringBoot中内嵌Tomcat并发容量

//当spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把bean加载进spring容器@Configurationpublic class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {@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并发容量的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎么在SpringBoot中内嵌Tomcat并发容量

本文链接: https://lsjlt.com/news/279238.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在SpringBoot中内嵌Tomcat并发容量
    怎么在SpringBoot中内嵌Tomcat并发容量?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。发现并发容器问题对单接口进行6000线程压测,每个线程请求5次,线程在5秒内创...
    99+
    2023-06-15
  • 解决SpringBoot内嵌Tomcat并发容量的问题
    一、SpringBoot内嵌Tomcat默认配置与优化 在做一个关于秒杀系统的模块,进行Jmeter压测性能的时候发现tomcat并发上不去,深入原因找到可供优化的地方,力求最大性能...
    99+
    2024-04-02
  • 如何在Spring Boot中内嵌Tomcat并启动
    本篇文章给大家分享的是有关如何在Spring Boot中内嵌Tomcat并启动,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。createEmbeddedServletConta...
    99+
    2023-05-31
    springboot tomcat omc
  • springboot内置tomcat支持最大的并发量问题怎么解决
    这篇文章主要介绍“springboot内置tomcat支持最大的并发量问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot内置tomcat支持最大的并发量问题怎么解决”文章...
    99+
    2023-07-05
  • 在Springboot项目中内嵌Tomcat时如何使用start
    这篇文章给大家介绍在Springboot项目中内嵌Tomcat时如何使用start,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  从TomcatEmbeddedServletContainer的this.tomcat...
    99+
    2023-05-31
    springboot start tomcat
  • 怎么在Spring Boot中移除内嵌的Tomcat
    怎么在Spring Boot中移除内嵌的Tomcat?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。修改pom.xml文件在pom.xml文件中去除内嵌tomcat,添加se...
    99+
    2023-06-06
  • springboot内置的tomcat支持最大的并发量问题
    目录springboot内置的tomcat支持最大的并发量Tomcat有两种处理连接的模式默认内嵌Tomcat配置提高tomcat并发量的几种方法总结springboot内置的tom...
    99+
    2023-03-12
    springboot内置tomcat springboot最大并发量 springboot并发量
  • 怎么在SpringBoot中调优tomcat
    怎么在SpringBoot中调优tomcat?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。springboot是什么springboot一种全新的编程规范,其设计目的是用来简化...
    99+
    2023-06-14
  • springboot最大并发量怎么配置
    在Spring Boot中,可以通过配置服务器的线程池来调整最大并发量。具体配置方式取决于你使用的服务器。以下是针对一些常见服务器的...
    99+
    2023-10-11
    springboot
  • 禁止SpringBoot在项目中使用Tomcat容器的原理是什么
    这篇文章主要讲解了“禁止SpringBoot在项目中使用Tomcat容器的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“禁止SpringBoot在项目中使用Tomcat容器的原理是...
    99+
    2023-07-02
  • 怎么在linux中使用命令批量替换内容
    本篇文章给大家分享的是有关怎么在linux中使用命令批量替换内容,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。比如要将所有包含abc文件里面的abc替换为def find -t...
    99+
    2023-06-10
  • 怎么在centos中使用tomcat 部署SpringBoot的war包
    今天就跟大家聊聊有关怎么在centos中使用tomcat 部署SpringBoot的war包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。准备war包一、准备好已有的SpringBo...
    99+
    2023-06-15
  • 怎么在Docker中配置tomcat的内存大小
    怎么在Docker中配置tomcat的内存大小?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、挂载docker中的配置文件通过将docker中tomcat的c...
    99+
    2023-06-14
  • vue中怎么使用slot分发内容
    这篇文章将为大家详细讲解有关vue中怎么使用slot分发内容,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、什么是slot在使用组件时,我们常常要像这样组...
    99+
    2024-04-02
  • ThreadLocal在Tomcat中引起内存泄露怎么解决
    这篇文章主要介绍“ThreadLocal在Tomcat中引起内存泄露怎么解决”,在日常操作中,相信很多人在ThreadLocal在Tomcat中引起内存泄露怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-05
  • 怎么在Vue.js中嵌套Grid表格并绑定数据
    这篇文章主要讲解了“怎么在Vue.js中嵌套Grid表格并绑定数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在Vue.js中嵌套Grid表格并绑定数据”吧!在Vue.js中嵌套Gri...
    99+
    2023-07-05
  • Java怎么用poi合并单元格并设置内容居中
    可以通过Apache POI库来操作Excel文件,实现合并单元格并设置内容居中。下面是一个简单的示例代码: import org....
    99+
    2024-03-01
    Java
  • css3怎么在页面中插入内容
    这篇文章主要讲解了“css3怎么在页面中插入内容”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3怎么在页面中插入内容”吧!A.使用选择器来插入内容h3...
    99+
    2024-04-02
  • 怎么在javascript中修改div的内容
    今天就跟大家聊聊有关怎么在javascript中修改div的内容,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。javascript修改div内容的方法:打开html开发工具,新建一个...
    99+
    2023-06-14
  • 怎么在python中读取列表内容
    这篇文章给大家介绍怎么在python中读取列表内容,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易入门...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作