Spring Boot 2 實戰:使用 Undertow 來替代Tomcat

  • 2019 年 12 月 5 日
  • 筆記

1. Undertow 簡介

Undertow 是一個採用 Java 開發的靈活的高性能 Web 服務器,提供包括阻塞和基於 NIO 的非堵塞機制。Undertow 是紅帽公司的開源產品,是 Wildfly 默認的 Web 服務器。Undertow 提供一個基礎的架構用來構建 Web 服務器,這是一個完全為嵌入式設計的項目,提供易用的構建器 API,完全向下兼容 Java EE Servlet 3.1 和低級非堵塞的處理器。

2. Undertow特點

  • 高性能 在多款同類產品的壓測中,在高並發情況下表現出色。
  • Servlet4.0 支持 它提供了對 Servlet4.0 的支持。
  • Web Socket 完全支持,包括JSR-356,用以滿足 Web 應用巨大數量的客戶端。
  • 內嵌式 它不需要容器,只需通過 API 即可快速搭建 Web 服務器。
  • 靈活性 交由鏈式Handler配置和處理請求,可以最小化按需加載模塊,無須加載多餘功能。
  • 輕量級 它是一個 內嵌Web 服務器, 由兩個核心 Jar 包組成

3. 替換默認的Tomcat

Spring boot 默認使用 Tomcat 內嵌容器 。依賴於 spring-boot-starter-web 。我們只需要排除 Tomcat 依賴。引用Undertow 就可以了,maven 配置如下:

  <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>     <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-undertow</artifactId>      </dependency>

4. 自定義配置Undertow

其實到第三步已經可以愉快地玩耍了。你可以立即在 https://felord.cn 找到更多教程來學習Spring Boot。當然你也可以再折騰一番,通過在Spring Boot 配置文件application.yml中配置 ServerPropertiesServerProperties.Undertow 的相關屬性。 總結了一下比較陌生的ServerProperties.Undertow 的屬性:

# 設置IO線程數, 它主要執行非阻塞的任務,它們會負責多個連接, 默認設置每個CPU核心一個線程  # 不要設置過大,如果過大,啟動項目會報錯:打開文件數過多  server:    undertow:       io-threads: 16  # 阻塞任務線程池, 當執行類似servlet請求阻塞IO操作, undertow會從這個線程池中取得線程  # 它的值設置取決於系統線程執行任務的阻塞係數,默認值是IO線程數*8       worker-threads: 256  # 以下的配置會影響buffer,這些buffer會用於服務器連接的IO操作,有點類似netty的池化內存管理  # 每塊buffer的空間大小,越小的空間被利用越充分,不要設置太大,以免影響其他應用,合適即可       buffer-size: 1024  # 每個區分配的buffer數量 , 所以pool的大小是buffer-size * buffers-per-region       buffers-per-region: 1024  # 是否分配的直接內存(NIO直接分配的堆外內存)       direct-buffers: true

5. 總結

今天我們演示了如何用性能優良的 Undertow 來作為Spring Boot 的 Servlet Web 容器。其實在並發量不大的情況下 Undertow、和其它兩款 Servlet Web 容器 JettyTomcat 的差距並不是很大。 Undertow 的優勢是高並發下的吞吐量。你可以根據自己的實際需要來選擇。