SpringBoot 內嵌容器Undertow替換Tomcat

前言

在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot默認的容器技術,而且是內嵌式的Tomcat。同時,SpringBoot也支持Undertow容器,我們可以很方便的用Undertow替換Tomcat,而Undertow的性能和內存使用方面都優於Tomcat,那我們如何使用Undertow技術呢?本文將爲大家細細講解。

SpringBoot中的Tomcat容器

SpringBoot可以說是目前最火的Java Web框架了。它將開發者從繁重的xml解救了出來,讓開發者在幾分鐘內就可以創建一個完整的Web服務,極大的提高了開發者的工作效率。Web容器技術是Web項目必不可少的組成部分,因爲任Web項目都要藉助容器技術來運行起來。在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot默認的容器技術,而且是內嵌式的Tomcat。

SpringBoot設置Undertow

對於Tomcat技術,Java程序員應該都非常熟悉,它是Web應用最常用的容器技術。我們最早的開發的項目基本都是部署在Tomcat下運行,那除了Tomcat容器,SpringBoot中我們還可以使用什麼容器技術呢?沒錯,就是題目中的Undertow容器技術。SrpingBoot已經完全繼承了Undertow技術,我們只需要引入Undertow的依賴即可,如所示。

移除tomcat等依賴

<!--web 模塊-->
<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
		<version>${spring-boot.version}</version>
		<exclusions>
				<!--排除tomcat依賴-->
				<exclusion>
					<artifactId>spring-boot-starter-tomcat</artifactId>
					<groupId>org.springframework.boot</groupId>
				</exclusion>
		</exclusions>
</dependency>

添加Undertow依賴:

<!--undertow容器-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

application配置 :

# Undertow 日誌存放目錄
server.undertow.accesslog.dir=
# 是否啓動日誌
server.undertow.accesslog.enabled=false 
# 日誌格式
server.undertow.accesslog.pattern=common
# 日誌文件名前綴
server.undertow.accesslog.prefix=access_log
# 日誌文件名後綴
server.undertow.accesslog.suffix=log
# HTTP POST請求最大的大小
server.undertow.max-http-post-size=0 
# 設置IO線程數, 它主要執行非阻塞的任務,它們會負責多個連接, 默認設置每個CPU核心一個線程
server.undertow.io-threads=4
# 阻塞任務線程池, 當執行類似servlet請求阻塞操作, undertow會從這個線程池中取得線程,它的值設置取決於系統的負載
server.undertow.worker-threads=20
# 以下的配置會影響buffer,這些buffer會用於服務器連接的IO操作,有點類似netty的池化內存管理
# 每塊buffer的空間大小,越小的空間被利用越充分
server.undertow.buffer-size=1024
# 每個區分配的buffer數量 , 所以pool的大小是buffer-size * buffers-per-region
server.undertow.buffers-per-region=1024
# 是否分配的直接內存
server.undertow.direct-buffers=true

配置好以後,我們啓動應用程序,發現容器已經替換爲Undertow。

Registering beans for JMX exposure on startup

<font style="color:red"> Undertow</font> started on port(s) 8080 (http) with context path ''

Started UndertowApplication in 3.933 seconds (JVM running for 6.734)

那我們爲什麼需要替換Tomcat爲Undertow技術呢?

Tomcat與Undertow的優劣對比

Tomcat是Apache基金下的一個輕量級的Servlet容器,支持Servlet和JSP。Tomcat具有Web服務器特有的功能,包括 Tomcat管理和控制平臺、安全局管理和Tomcat閥等。Tomcat本身包含了HTTP服務器,因此也可以視作單獨的Web服務器。但是,Tomcat和ApacheHTTP服務器不是一個東西,ApacheHTTP服務器是用C語言實現的HTTP Web服務器。Tomcat是完全免費的,深受開發者的喜愛。

Undertow是Red Hat公司的開源產品, 它完全採用Java語言開發,是一款靈活的高性能Web服務器,支持阻塞IO和非阻塞IO。由於Undertow採用Java語言開發,可以直接嵌入到Java項目中使用。同時, Undertow完全支持Servlet和Web Socket,在高併發情況下表現非常出色。

我們在相同機器配置下壓測Tomcat和Undertow,得到的測試結果如下所示:

  • QPS測試結果對比:

Tomcat

Undertow

  • 內存使用對比:

Tomcat

Undertow

通過測試發現,在高併發系統中,Tomcat相對來說比較弱。在相同的機器配置下,模擬相等的請求數,Undertow在性能和內存使用方面都是最優的。並且Undertow新版本默認使用持久連接,這將會進一步提高它的併發吞吐能力。所以,如果是高併發的業務系統,Undertow是最佳選擇。

最後

SpingBoot中我們既可以使用Tomcat作爲Http服務,也可以用Undertow來代替。Undertow在高併發業務場景中,性能優於Tomcat。所以,如果我們的系統是高併發請求,不妨使用一下Undertow,你會發現你的系統性能會得到很大的提升。

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