SpringBoot教程-Undertow替換tomcat容器

配置之前,您需要知道的是,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)

2019-02-22 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)
2019-02-22 20:29:28.885  INFO 21908 --- [           main] s.e.s.SpringBootUndertowApplication      : No active profile set, falling back to default profiles: default
2019-02-22 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
2019-02-22 20:29:34.478  INFO 21908 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2019-02-22 20:29:34.478  INFO 21908 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5449 ms
2019-02-22 20:29:35.471  INFO 21908 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-02-22 20:29:36.423  INFO 21908 --- [           main] org.xnio                                 : XNIO version 3.3.8.Final
2019-02-22 20:29:36.447  INFO 21908 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.3.8.Final
2019-02-22 20:29:36.614  INFO 21908 --- [           main] o.s.b.w.e.u.UndertowServletWebServer     : Undertow started on port(s) 8080 (http) with context path ''
2019-02-22 20:29:36.621  INFO 21908 --- [           main] s.e.s.SpringBootUndertowApplication      : Started SpringBootUndertowApplication in 8.912 seconds (JVM running for 10.232)
2019-02-22 20:29:48.534  INFO 21908 --- [  XNIO-1 task-1] io.undertow.servlet                      : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-02-22 20:29:48.534  INFO 21908 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-02-22 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 容器做一些特定配置,如日誌輸出路徑,設置工作者線程的個數等參數優化等,如下所示:

# 是否打開 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 性能指標

可以看到,Tomcat 大約使用了 110M 的堆內存以及大約 16 個線程數!

再來看看輕量級 Servlet 容器 Undertow 的指標:

Undertow 性能指標

Undertow 的內存使用情況大約爲 90M, 線程數大約 13 個線程的樣子。這還是在應用不復雜的情況下,大型應用出入會更大。

五、GitHub 源碼

https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-undertow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章