springboot中undertow容器的使用及說明
1、undertow介紹
官網(wǎng):https://undertow.io/
Undertow 是一個(gè)輕量級的、高性能的 Java Web 服務(wù)器,由 JBoss 開發(fā)并開源。它是基于非阻塞(non-blocking)的I/O模型,具有低資源消耗和高并發(fā)處理能力。
Undertown 的優(yōu)勢如下:
- 支持 HTTP/2:Undertow 開箱即支持 HTTP/2,無需重寫啟動類路徑。
- 支持 HTTP Upgrade:允許通過 HTTP 端口復(fù)用多種協(xié)議。
- 支持 Web Socket:Undertow 提供對 Web Sockets 的全面支持,包括 JSR-356 支持。
- Servlet 4.0:Undertow 支持 Servlet 4.0,包括對嵌入式 Servlet 的支持。還可以在同一部署中混合使用 Servlet 和原生 undertow 非阻塞 handler。
- 可嵌入式:只需幾行代碼,即可將 Undertow 嵌入應(yīng)用程序或獨(dú)立運(yùn)行。
- 靈活性:Undertow 通過鏈?zhǔn)?handler 進(jìn)行配置,可以根據(jù)需求靈活地添加功能。
- 在很多場景的測試下, Undertow 的性能都高于 Tomcat。天生適合作為 Spring Boot 應(yīng)用的嵌入式服務(wù)器!
說明:tomcat主要支持以下幾種IO 模型:
- BIO(Blocking I/O):傳統(tǒng)的同步阻塞IO,每個(gè)請求都對應(yīng)一個(gè)線程,在處理速度慢的情況下容易造成線程堆積。
- NIO(Non-blocking I/O):使用JDK 1.4 和 java.nio 包,支持非阻塞I/O,能夠通過少量線程處理大量并發(fā)連接,提高了服務(wù)器的吞吐量和并發(fā)能力。Tomcat 8 及以上版本默認(rèn)就運(yùn)行在NIO 模式下。
- APR(Apache Portable Runtime):通過JNI 調(diào)用Apache HTTP 服務(wù)器的核心動態(tài)鏈接庫,利用操作系統(tǒng)的非阻塞IO 能力,可以大幅提升處理靜態(tài)文件和高并發(fā)的性能。
- AIO(Asynchronous I/O,也稱NIO.2):從JDK 7 開始支持的異步非阻塞IO,是目前最先進(jìn)的IO 模型。
2、springboot中使用undertow
Spring Boot 默認(rèn)使用 Tomcat 作為嵌入式 Servlet 服務(wù)器,所以 spring-boot-starter-web 默認(rèn)依賴了 spring-boot-starter-tomcat。
要使用 Undertow 首先要從 spring-boot-starter-web 排除 spring-boot-starter-tomcat,再添加 spring-boot-starter-undertow 依賴:
<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>
<exclusions>
<!-- 排除 undertow-websockets-jsr 依賴 -->
<exclusion>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
</exclusion>
</exclusions>
</dependency>在springboot中指定端口:(同tomcat)
server.port=8081 server.servlet.session.timeout=2M
undertow配置:
| 配置項(xiàng) | 說明 | 示例 |
|---|---|---|
| server.undertow.accesslog.dir | Undertow 訪問日志目錄。 | |
| server.undertow.accesslog.enabled | 是否啟用訪問日志。 | false |
| server.undertow.accesslog.pattern | 訪問日志的格式。 | common |
| server.undertow.accesslog.prefix | 日志文件前綴。 | access_log. |
| server.undertow.accesslog.rotate | 是否開啟日志滾動。 | true |
| server.undertow.accesslog.suffix | 日志文件后綴。 | log |
| server.undertow.always-set-keep-alive | 是否應(yīng)在所有響應(yīng)中添加 Connection: keep-alive Header,即使 HTTP 規(guī)范沒有要求。 | true |
| server.undertow.buffer-size | 每個(gè) buffer 的大小。默認(rèn)大小是根據(jù) JVM 可用的最大內(nèi)存確定的。 | |
| server.undertow.decode-slash | 是否應(yīng)解碼已編碼的斜線字符(%2F)。如果前端代理不執(zhí)行相同的解碼,解碼可能會導(dǎo)致安全問題。只有在傳統(tǒng)應(yīng)用程序需要時(shí)才啟用。設(shè)置后,server.undertow.allow-encoded-slash 無效。 | |
| server.undertow.decode-url | 是否對 URL 進(jìn)行解碼。禁用時(shí),URL 中的百分比編碼字符將保持原樣。 | true |
| server.undertow.direct-buffers | 是否在 Java 堆外分配 buffer。默認(rèn)大小是根據(jù) JVM 可用的最大內(nèi)存確定的。 | |
| server.undertow.eager-filter-init | 是否應(yīng)在啟動時(shí)初始化 servlet Filter | true |
| server.undertow.max-cookies | 允許的最大 cookie 數(shù)量。這一限制是為了防止基于哈希碰撞的 DOS 攻擊。 | 200 |
| server.undertow.max-headers | 允許的最大 header 數(shù)量。這一限制是為了防止基于哈希碰撞的 DOS 攻擊。 | |
| server.undertow.max-http-post-size | HTTP post content 的最大大小。當(dāng)值為-1(默認(rèn)值)時(shí),大小為無限。 | -1B |
| server.undertow.max-parameters | 允許查詢或路徑參數(shù)的最大數(shù)量。這一限制是為了防止基于哈希碰撞的 DOS 攻擊。 | |
| server.undertow.no-request-timeout | 在服務(wù)器關(guān)閉連接之前,連接在不處理請求的情況下閑置的時(shí)間。 | |
| server.undertow.options.server.* | 在 io.undertow.UndertowOptions 中定義的服務(wù)器選項(xiàng)。 | |
| server.undertow.options.socket.* | 在 org.xnio.Options 中定義的 socket 選項(xiàng)。 | |
| server.undertow.preserve-path-on-forward | 轉(zhuǎn)發(fā)請求時(shí)是否保留請求路徑。 | false |
| server.undertow.threads.io | I/O 線程數(shù)。默認(rèn)值為可用的處理器數(shù)量。 | |
| server.undertow.threads.worker | Worker 線程數(shù)。默認(rèn)為 I/O 線程數(shù)的 8 倍。 | |
| server.undertow.url-charset | 用于解碼 URL 的字符集。 | UTF-8 |
3、性能對比
1)吞吐量和響應(yīng)時(shí)間

2)cpu使用率:Undertow < Jetty < Tomcat

3)內(nèi)存使用率:Undertow < Jetty < Tomcat

4)線程數(shù):Undertow < Jetty < Tomcat

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot配置Undertow服務(wù)器全過程
- SpringBoot利用Undertow實(shí)現(xiàn)高可用的反向代理配置
- Springboot優(yōu)化內(nèi)置服務(wù)器Tomcat優(yōu)化方式(underTow)
- SpringBoot中優(yōu)化Undertow性能的方法總結(jié)
- springboot中使用undertow踩坑記(最新推薦)
- SpringBoot如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
- springboot切換使用undertow容器的方式
- SpringBoot如何使用Undertow做服務(wù)器
相關(guān)文章
Java輸入流Scanner/BufferedReader使用方法示例
這篇文章主要介紹了Java輸入流Scanner/BufferedReader使用方法,大家看示例吧2013-11-11
java利用遞歸調(diào)用實(shí)現(xiàn)樹形菜單的樣式
這篇文章主要給大家介紹了關(guān)于java利用遞歸調(diào)用實(shí)現(xiàn)樹形菜單樣式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
idea啟動項(xiàng)目報(bào)端口號沖突或被占用的解決方法
這篇文章主要介紹了idea啟動項(xiàng)目報(bào)端口號沖突或被占用的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
java基于jdbc連接mysql數(shù)據(jù)庫功能實(shí)例詳解
這篇文章主要介紹了java基于jdbc連接mysql數(shù)據(jù)庫功能,結(jié)合實(shí)例形式詳細(xì)分析了jdbc連接mysql數(shù)據(jù)庫的原理、步驟、實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下2017-10-10

