1. Undertow 簡介
Undertow 是一個采用 Java 開發(fā)的靈活的高性能 Web 服務(wù)器爵嗅,提供包括阻塞和基于 NIO
的非堵塞機制广料。Undertow 是紅帽公司的開源產(chǎn)品诵肛,是 Wildfly 默認(rèn)的 Web 服務(wù)器媒抠。Undertow 提供一個基礎(chǔ)的架構(gòu)用來構(gòu)建 Web 服務(wù)器祟蚀,這是一個完全為嵌入式設(shè)計的項目水援,提供易用的構(gòu)建器 API,完全向下兼容 Java EE Servlet 3.1
和低級非堵塞的處理器宴杀。
2. Undertow特點
- 高性能 在多款同類產(chǎn)品的壓測中癣朗,在高并發(fā)情況下表現(xiàn)出色。
- Servlet4.0 支持 它提供了對 Servlet4.0 的支持旺罢。
- Web Socket 完全支持旷余,包括JSR-356,用以滿足 Web 應(yīng)用巨大數(shù)量的客戶端扁达。
- 內(nèi)嵌式 它不需要容器正卧,只需通過 API 即可快速搭建 Web 服務(wù)器。
- 靈活性 交由鏈?zhǔn)紿andler配置和處理請求跪解,可以最小化按需加載模塊炉旷,無須加載多余功能。
- 輕量級 它是一個 內(nèi)嵌Web 服務(wù)器, 由兩個核心 Jar 包組成
3. 替換默認(rèn)的Tomcat
Spring boot 默認(rèn)使用 Tomcat 內(nèi)嵌容器 窘行。依賴于 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
其實到第三步已經(jīng)可以愉快地玩耍了但绕。你可以立即在 https://felord.cn 找到更多教程來學(xué)習(xí)Spring Boot。當(dāng)然你也可以再折騰一番翘骂,通過在Spring Boot 配置文件application.yml
中配置 ServerProperties
和ServerProperties.Undertow
的相關(guān)屬性壁熄。 總結(jié)了一下比較陌生的ServerProperties.Undertow
的屬性:
# 設(shè)置IO線程數(shù), 它主要執(zhí)行非阻塞的任務(wù),它們會負(fù)責(zé)多個連接, 默認(rèn)設(shè)置每個CPU核心一個線程
# 不要設(shè)置過大,如果過大碳竟,啟動項目會報錯:打開文件數(shù)過多
server:
undertow:
io-threads: 16
# 阻塞任務(wù)線程池, 當(dāng)執(zhí)行類似servlet請求阻塞IO操作, undertow會從這個線程池中取得線程
# 它的值設(shè)置取決于系統(tǒng)線程執(zhí)行任務(wù)的阻塞系數(shù)草丧,默認(rèn)值是IO線程數(shù)*8
worker-threads: 256
# 以下的配置會影響buffer,這些buffer會用于服務(wù)器連接的IO操作,有點類似netty的池化內(nèi)存管理
# 每塊buffer的空間大小,越小的空間被利用越充分,不要設(shè)置太大莹桅,以免影響其他應(yīng)用昌执,合適即可
buffer-size: 1024
# 每個區(qū)分配的buffer數(shù)量 , 所以pool的大小是buffer-size * buffers-per-region
buffers-per-region: 1024
# 是否分配的直接內(nèi)存(NIO直接分配的堆外內(nèi)存)
direct-buffers: true
5. 總結(jié)
今天我們演示了如何用性能優(yōu)良的 Undertow 來作為Spring Boot 的 Servlet Web 容器。其實在并發(fā)量不大的情況下 Undertow
诈泼、和其它兩款 Servlet Web 容器 Jetty
懂拾、Tomcat
的差距并不是很大。 Undertow
的優(yōu)勢是高并發(fā)下的吞吐量铐达。你可以根據(jù)自己的實際需要來選擇岖赋。
關(guān)注公眾號:碼農(nóng)小胖哥,獲取更多資訊