详解SpringBoot同时可以处理多少请求

 更新时间:2024年06月20日 10:58:08   作者:苏生Susheng  
在日常操作中,相信很多人在SpringBoot能同时处理多少请求问题上存在疑惑,本文就来详细的介绍一下,感兴趣的可以了解一下

问题

之前看到过一个面试题:SpringBoot同时可以处理多少请求?

  • 准确的来说,Spring Boot 同时可以处理多少个请求,并不取决于 Spring Boot 框架本身,而是取决于其内置的 Web 容器(因为 Web 容器的行为,决定了 Spring Boot 的行为,所以咱们姑且认为两个问题的回答是一样的)。
  • Tomcat的默认最大连接数是200,可以通过配置文件或者编程方式进行调整。另外,Spring Boot还支持使用其他的Web容器,如Jetty或Undertow,这些容器的性能表现可能不同。
  • 除了Web容器的配置,应用程序的设计也会影响并发处理能力。合理的线程池配置、异步处理和优化数据库查询等技术手段可以提高应用程序的并发处理能力。

Web三大容器

  • Web三大容器:Tomcat、Jetty、Undertow,众所周知,Tomcat 为 Spring Boot 框架默认的 Web 容器

三者区别

Tomcat

  • Tomcat 是 Apache 软件基金会下的开源项目,是最广泛使用的 Servlet 容器之一,完全实现了 Java Servlet 和 JavaServer Pages(JSP)规范。
  • 它不仅是一个 Servlet 容器,也是一个轻量级的应用服务器,尽管相比其他轻量级服务器,Tomcat 被认为是稍微重一些的。
  • Tomcat 支持众多的企业级特性,如 SSL、连接池等,适合运行大型的、复杂的企业级应用。
  • 它的稳定性和成熟度经过了多年的企业级应用验证,因此在很多企业中作为首选的 Web 容器。

Undertow

  • Undertow 是 Red Hat(红帽公司)开发的一个灵活的、高性能的 Web 服务器和反向代理服务器,它是 WildFly 应用服务器的默认 Web 容器。
  • Undertow 设计上注重低内存占用和高并发处理能力,尤其擅长处理大量的短连接场景,比如 RESTful API 服务。
  • Undertow 支持 Servlet 3.1、WebSocket以及非阻塞 IO(NIO),并且是支持 HTTP/2 协议的现代服务器之一。
  • 它的设计理念在于提供一个模块化、可嵌入式的解决方案,易于集成到现有的系统中,同时也适合微服务架构。

Jetty

  • Jetty 是一个开源的、轻量级的 Web 服务器和 Servlet 容器,由 Eclipse 基金会维护。
  • 它以其可嵌入式、高度可配置性著称,常用于需要快速启动和轻量级部署的场景,比如开发阶段、测试环境或轻量级应用。
  • Jetty 也支持 Servlet 规范和 WebSocket,且同样基于 NIO,使得它在处理大量并发连接时表现出色。
  • Jetty 设计上强调灵活性和可扩展性,易于通过 API 定制以满足特定需求,因此在云环境、持续集成、DevOps 等领域很受欢迎。

小结

特性TomcatJettyUndertow
出现时间1999年1994年2008年
支持的协议HTTP, HTTPS, AJPHTTP, HTTPS, SPDY, AJPHTTP, HTTPS, SPDY
内存占用相对较大相对较小相对较小
启动速度相对较慢相对较快相对较快
性能中等
异步支持支持支持支持
部署方式WAR, JAR, 打包为可执行JARWAR, JAR, 打包为可执行JARWAR, JAR, 打包为可执行JAR
可嵌入性支持支持支持
社区支持非常活跃活跃活跃
成熟度成熟成熟较新但持续发展

总的来说

  • Tomcat 因其成熟稳定和企业级特性适用于大型应用;
  • Undertow 以高性能和低内存占用见长,特别适合处理高并发短连接场景;
  • 而 Jetty 则以轻量、灵活、易于嵌入为特点,适合快速开发和轻量级部署。

最大连接数和最大等待数

以 Spring Boot 框架默认的 Web 容器 Tomcat 为例,它能够同时处理多少个请求,其实是在 Spring Boot 框架中的 spring-configuration-metadata.json 文件中配置着

在这里插入图片描述

打开此文件,搜索“server.tomcat.max-connections”(Tomcat 最大连接数)会得到以下结果:

在这里插入图片描述

也就是说,默认情况下 Tomcat 允许的最大连接数是 8192(=8*1024)个。

注意!! 虽然 Tomcat 可以允许最大的连接数是 8192,但是 Tomcat 还有一个最大等待数,也就是说,如果达到了 8192 之后,还有一个等待队列可以存放请求的连接,所以,Spring Boot 可以同时处理多少个连接,等于 Tomcat 的最大连接数加 Tomcat 的最大等待数。

搜索“server.tomcat.accept-count”(Tomcat 最大等待数),搜索结果如下图所示

在这里插入图片描述

也就是说,默认情况下,Tomcat 最大等待数为 100 个。

同时处理请求数

  • 上面得出结论:默认情况下 Spring Boot 能够同时处理的请求数=最大连接数(8192)+最大等待数(100),结果为 8292 个。
  • 当然,这两个值是可以在 Spring Boot 配置文件中修改的,如下配置所示
server:
  tomcat:
    max-connections: 2000 # 最大连接数
    accept-count: 200 # 最大等待数

拓展:设置Web容器

pring Boot 框架如何设置 Web 容器为 Jetty 或 Undertow 呢

设置容器为Jetty

要设置 Spring Boot 框架的 Web 容器为 Jetty,只需要修改 pom.xml 文件即可,如下配置所示:

<dependencies>
    <!-- Spring Boot Starter Web 但排除Tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 排除Tomcat -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 添加Jetty起步依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
</dependencies>

也就是说,只需要将默认的 tomcat 排除掉,添加 jetty 的依赖即可。

设置容器为Undertow

要设置 Spring Boot 框架的 Web 容器为 Undertow 的思路和上面 Jetty 的实现思路相同,只需要修改 pom.xml 文件即可,如下配置所示:

<dependencies>
    <!-- Spring Boot Starter Web 但排除Tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 添加Undertow起步依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
    </dependency>
</dependencies>

到此这篇关于详解SpringBoot同时可以处理多少请求的文章就介绍到这了,更多相关SpringBoot同时处理请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 比较排序之快速排序(实例代码)

    比较排序之快速排序(实例代码)

    下面小编就为大家带来一篇比较排序之快速排序(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 通过JDK源码分析关闭钩子详解

    通过JDK源码分析关闭钩子详解

    一个简单的关闭钩子,程序被中断或者正常退出时会显示 hook shutdown!非常的优雅,有效,巧妙。那么这篇文章就来给大家介绍关于通过JDK源码分析关闭钩子的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴。
    2017-11-11
  • 详解Java的堆内存与栈内存的存储机制

    详解Java的堆内存与栈内存的存储机制

    这篇文章主要介绍了Java的堆内存与栈内存的存储机制,包括JVM的内存优化和GC等相关方面内容,需要的朋友可以参考下
    2016-01-01
  • java后端实现信息分页查询的示例代码

    java后端实现信息分页查询的示例代码

    在一个页面展示大量的用户信息不便于观看,因此就需要采用分页展示的方法,本文就来为大家介绍一下java后端如何实现信息分页查询,需要的小伙伴可以参考下
    2023-11-11
  • 使用Spring特性实现接口多实现类的动态调用方式

    使用Spring特性实现接口多实现类的动态调用方式

    这篇文章主要介绍了使用Spring特性实现接口多实现类的动态调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java并发之嵌套管程锁死详解

    Java并发之嵌套管程锁死详解

    这篇文章主要介绍了Java并发之嵌套管程锁死详解,涉及嵌套管程锁死的发生,实例等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java多线程定时器Timer原理及实现

    Java多线程定时器Timer原理及实现

    这篇文章主要介绍了Java多线程定时器Timer原理及实现,涉及Timer的schedule的使用,定时器Timer的schedule等相关内容以及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java中Hibernate的状态总结

    java中Hibernate的状态总结

    在本篇内容里小编给大家整理的是一篇关于java中Hibernate的状态总结内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • java ArrayList和Vector的区别详解

    java ArrayList和Vector的区别详解

    这篇文章主要介绍了java ArrayList和Vector的区别详解的相关资料,并附简单实例代码,需要的朋友可以参考下
    2016-11-11
  • 解析JavaSE的继承和多态

    解析JavaSE的继承和多态

    这篇文章主要为大家详细介绍了JavaSE的继承和多态,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论