配置之前,您需要知道的是,Tomcat, Jetty, Undertow 作為三大主流 Servelt 容器,Undertow 的性能要優於前兩者。 所以,我們推薦您使用 Undertow 容器。接下來,就我們看看如何在 Spring Boot 中快捷地集成 Undertow。 一、添加 Maven ...
配置之前,您需要知道的是,Tomcat, Jetty, Undertow 作為三大主流 Servelt 容器,Undertow 的性能要優於前兩者。
所以,我們推薦您使用 Undertow 容器。接下來,就我們看看如何在 Spring Boot 中快捷地集成 Undertow。
一、添加 Maven 依賴
<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>
<!-- 添加 Undertow 容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
二、啟動項目
添加完上面的 maven 依賴後,Undertow 容器就已經集成完畢了,接下來,讓我們啟動項目,看看控制台輸出:
Connected to the target VM, address: '127.0.0.1:50915', transport: 'socket'
. ____ _ __ _ _
/\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )___ | '_ | '_| | '_ / _` | \ \ \ \
\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.2.RELEASE)
2023-10-10 20:29:28.876 INFO 21908 --- [ main] s.e.s.SpringBootUndertowApplication : Starting SpringBootUndertowApplication on DESKTOP-RL6P6LA with PID 21908 (C:\dev\idea_workspace_personal\spring-boot-tutorial\spring-boot-undertow\target\classes started by allen in C:\dev\idea_workspace_personal\spring-boot-tutorial)
2023-10-10 20:29:28.885 INFO 21908 --- [ main] s.e.s.SpringBootUndertowApplication : No active profile set, falling back to default profiles: default
2023-10-10 20:29:34.388 WARN 21908 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2023-10-10 20:29:34.478 INFO 21908 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext
2023-10-10 20:29:34.478 INFO 21908 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 5449 ms
2023-10-10 20:29:35.471 INFO 21908 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2023-10-10 20:29:36.423 INFO 21908 --- [ main] org.xnio : XNIO version 3.3.8.Final
2023-10-10 20:29:36.447 INFO 21908 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.3.8.Final
2023-10-10 20:29:36.614 INFO 21908 --- [ main] o.s.b.w.e.u.UndertowServletWebServer : Undertow started on port(s) 8080 (http) with context path ''
2023-10-10 20:29:36.621 INFO 21908 --- [ main] s.e.s.SpringBootUndertowApplication : Started SpringBootUndertowApplication in 8.912 seconds (JVM running for 10.232)
2023-10-10 20:29:48.534 INFO 21908 --- [ XNIO-1 task-1] io.undertow.servlet : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-10-10 20:29:48.534 INFO 21908 --- [ XNIO-1 task-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2023-10-10 20:29:48.547 INFO 21908 --- [ XNIO-1 task-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 12 ms
啟動成功,當您看到 Undertow started on port(s) 8080 (http) with context path ''
的行輸出時,說明此時正在使用的是 Undertow 容器,而非 Tomcat !
三、Undertow 相關配置
您可以針對 Undertow 容器做一些特定配置,如日誌輸出路徑,設置工作者線程的個數等參數優化等,如下所示:
# 是否打開 undertow 日誌,預設為 false
server.undertow.accesslog.enabled=false
# 設置訪問日誌所在目錄
server.undertow.accesslog.dir=logs
# 指定工作者線程的 I/0 線程數,預設為 2 或者 CPU 的個數
server.undertow.io-threads=
# 指定工作者線程個數,預設為 I/O 線程個數的 8 倍
server.undertow.worker-threads=
# 設置 HTTP POST 內容的最大長度,預設不做限制
server.undertow.max-http-post-size=0
四、Tomcat Vs Undertow 容器性能對比
在文章的開始,我們提到過 Undertow 的性能要優於 Tomcat, 但是口說無憑,需要拿出實際的證據,新建一個 Web 項目,通過 JDK 自帶的工具對比一下各項指標情況:
先看看 Tomcat:
可以看到,Tomcat 大約使用了 110M 的堆記憶體以及大約 16 個線程數!
再來看看輕量級 Servlet 容器 Undertow 的指標:
Undertow 的記憶體使用情況大約為 90M, 線程數大約 13 個線程的樣子。這還是在應用不複雜的情況下,大型應用出入會更大。
五、環境說明
上述 Demo 是基於 Spring Boot 2.1.2.RELEASE,需要註意一下 !
本文來自博客園,作者:深碼青年,轉載請註明原文鏈接:https://www.cnblogs.com/shenMaQN/p/17769993.html