詳解SpringBoot同時可以處理多少請求
問題
之前看到過一個面試題:SpringBoot同時可以處理多少請求?
- 準確的來說,Spring Boot 同時可以處理多少個請求,并不取決于 Spring Boot 框架本身,而是取決于其內(nèi)置的 Web 容器(因為 Web 容器的行為,決定了 Spring Boot 的行為,所以咱們姑且認為兩個問題的回答是一樣的)。
- Tomcat的默認最大連接數(shù)是200,可以通過配置文件或者編程方式進行調(diào)整。另外,Spring Boot還支持使用其他的Web容器,如Jetty或Undertow,這些容器的性能表現(xiàn)可能不同。
- 除了Web容器的配置,應(yīng)用程序的設(shè)計也會影響并發(fā)處理能力。合理的線程池配置、異步處理和優(yōu)化數(shù)據(jù)庫查詢等技術(shù)手段可以提高應(yīng)用程序的并發(fā)處理能力。
Web三大容器
- Web三大容器:Tomcat、Jetty、Undertow,眾所周知,Tomcat 為 Spring Boot 框架默認的 Web 容器
三者區(qū)別
Tomcat
- Tomcat 是 Apache 軟件基金會下的開源項目,是最廣泛使用的 Servlet 容器之一,完全實現(xiàn)了 Java Servlet 和 JavaServer Pages(JSP)規(guī)范。
- 它不僅是一個 Servlet 容器,也是一個輕量級的應(yīng)用服務(wù)器,盡管相比其他輕量級服務(wù)器,Tomcat 被認為是稍微重一些的。
- Tomcat 支持眾多的企業(yè)級特性,如 SSL、連接池等,適合運行大型的、復(fù)雜的企業(yè)級應(yīng)用。
- 它的穩(wěn)定性和成熟度經(jīng)過了多年的企業(yè)級應(yīng)用驗證,因此在很多企業(yè)中作為首選的 Web 容器。
Undertow
- Undertow 是 Red Hat(紅帽公司)開發(fā)的一個靈活的、高性能的 Web 服務(wù)器和反向代理服務(wù)器,它是 WildFly 應(yīng)用服務(wù)器的默認 Web 容器。
- Undertow 設(shè)計上注重低內(nèi)存占用和高并發(fā)處理能力,尤其擅長處理大量的短連接場景,比如 RESTful API 服務(wù)。
- Undertow 支持 Servlet 3.1、WebSocket以及非阻塞 IO(NIO),并且是支持 HTTP/2 協(xié)議的現(xiàn)代服務(wù)器之一。
- 它的設(shè)計理念在于提供一個模塊化、可嵌入式的解決方案,易于集成到現(xiàn)有的系統(tǒng)中,同時也適合微服務(wù)架構(gòu)。
Jetty
- Jetty 是一個開源的、輕量級的 Web 服務(wù)器和 Servlet 容器,由 Eclipse 基金會維護。
- 它以其可嵌入式、高度可配置性著稱,常用于需要快速啟動和輕量級部署的場景,比如開發(fā)階段、測試環(huán)境或輕量級應(yīng)用。
- Jetty 也支持 Servlet 規(guī)范和 WebSocket,且同樣基于 NIO,使得它在處理大量并發(fā)連接時表現(xiàn)出色。
- Jetty 設(shè)計上強調(diào)靈活性和可擴展性,易于通過 API 定制以滿足特定需求,因此在云環(huán)境、持續(xù)集成、DevOps 等領(lǐng)域很受歡迎。
小結(jié)
特性 | Tomcat | Jetty | Undertow |
---|---|---|---|
出現(xiàn)時間 | 1999年 | 1994年 | 2008年 |
支持的協(xié)議 | HTTP, HTTPS, AJP | HTTP, HTTPS, SPDY, AJP | HTTP, HTTPS, SPDY |
內(nèi)存占用 | 相對較大 | 相對較小 | 相對較小 |
啟動速度 | 相對較慢 | 相對較快 | 相對較快 |
性能 | 中等 | 高 | 高 |
異步支持 | 支持 | 支持 | 支持 |
部署方式 | WAR, JAR, 打包為可執(zhí)行JAR | WAR, JAR, 打包為可執(zhí)行JAR | WAR, JAR, 打包為可執(zhí)行JAR |
可嵌入性 | 支持 | 支持 | 支持 |
社區(qū)支持 | 非常活躍 | 活躍 | 活躍 |
成熟度 | 成熟 | 成熟 | 較新但持續(xù)發(fā)展 |
總的來說
- Tomcat 因其成熟穩(wěn)定和企業(yè)級特性適用于大型應(yīng)用;
- Undertow 以高性能和低內(nèi)存占用見長,特別適合處理高并發(fā)短連接場景;
- 而 Jetty 則以輕量、靈活、易于嵌入為特點,適合快速開發(fā)和輕量級部署。
最大連接數(shù)和最大等待數(shù)
以 Spring Boot 框架默認的 Web 容器 Tomcat 為例,它能夠同時處理多少個請求,其實是在 Spring Boot 框架中的 spring-configuration-metadata.json 文件中配置著
打開此文件,搜索“server.tomcat.max-connections”(Tomcat 最大連接數(shù))會得到以下結(jié)果:
也就是說,默認情況下 Tomcat 允許的最大連接數(shù)是 8192(=8*1024)個。
注意!! 雖然 Tomcat 可以允許最大的連接數(shù)是 8192,但是 Tomcat 還有一個最大等待數(shù),也就是說,如果達到了 8192 之后,還有一個等待隊列可以存放請求的連接,所以,Spring Boot 可以同時處理多少個連接,等于 Tomcat 的最大連接數(shù)加 Tomcat 的最大等待數(shù)。
搜索“server.tomcat.accept-count”(Tomcat 最大等待數(shù)),搜索結(jié)果如下圖所示
也就是說,默認情況下,Tomcat 最大等待數(shù)為 100 個。
同時處理請求數(shù)
- 上面得出結(jié)論:默認情況下 Spring Boot 能夠同時處理的請求數(shù)=最大連接數(shù)(8192)+最大等待數(shù)(100),結(jié)果為 8292 個。
- 當然,這兩個值是可以在 Spring Boot 配置文件中修改的,如下配置所示
server: tomcat: max-connections: 2000 # 最大連接數(shù) accept-count: 200 # 最大等待數(shù)
拓展:設(shè)置Web容器
pring Boot 框架如何設(shè)置 Web 容器為 Jetty 或 Undertow 呢
設(shè)置容器為Jetty
要設(shè)置 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 的依賴即可。
設(shè)置容器為Undertow
要設(shè)置 Spring Boot 框架的 Web 容器為 Undertow 的思路和上面 Jetty 的實現(xiàn)思路相同,只需要修改 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>
到此這篇關(guān)于詳解SpringBoot同時可以處理多少請求的文章就介紹到這了,更多相關(guān)SpringBoot同時處理請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Admin - SpringBoot + Maven 多啟動環(huán)境配置實例詳解
這篇文章主要介紹了Admin - SpringBoot + Maven 多啟動環(huán)境配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Spring Cloud Zuul自定義過濾器的實現(xiàn)
這篇文章主要介紹了自定義Spring Cloud Zuul過濾器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03iOS獲取AppIcon and LaunchImage''s name(app圖標和啟動圖片名字)
這篇文章主要介紹了iOS獲取AppIcon and LaunchImage's name(app圖標和啟動圖片名字)的相關(guān)資料,非常不錯,具有參考借鑒價值,感興趣的朋友一起學習吧2016-08-08SpringBoot或SpringAI對接DeepSeek大模型的詳細步驟
這篇文章主要介紹了DeepSeek智能助手的使用方法和步驟,包括引入庫、配置環(huán)境變量和配置,文章詳細描述了流式請求和非流式請求的實現(xiàn)方式,需要的朋友可以參考下2025-02-02Dubbo Service Mesh基礎(chǔ)架構(gòu)組件改造
Service Mesh這個“熱”詞是2016年9月被“造”出來,而今年2018年更是被稱為service Mesh的關(guān)鍵之年,各家大公司都希望能在這個思潮下領(lǐng)先一步2023-03-03