SpringBoot如何使用Undertow做服務(wù)器
使用Undertow做服務(wù)器
說明
undertow,jetty和tomcat可以說是javaweb項目當(dāng)下最火的三款服務(wù)器,tomcat是apache下的一款重量級的服務(wù)器,不用多說歷史悠久,經(jīng)得起實踐的考驗。
然而:當(dāng)下微服務(wù)興起,spring boot ,spring cloud 越來越熱的情況下,選擇一款輕量級而性能優(yōu)越的服務(wù)器是必要的選擇。
spring boot 完美集成了tomcat,jetty和undertow,本文將通過對jetty和undertow服務(wù)器的分析以及測試,來比較兩款服務(wù)器的性能如何。
值得一提的是jetty和undertow都是基于NIO實現(xiàn)的高并發(fā)輕量級的服務(wù)器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。
NIO(非阻塞式輸入輸出)
Channel
Selector
Buffer
Acceptor
Client和Server只向Buffer讀寫數(shù)據(jù)不關(guān)注數(shù)據(jù)的流向,數(shù)據(jù)通過Channel通道進行流轉(zhuǎn)。而Selector是存在與服務(wù)端的,用于Channel的注冊以此實現(xiàn)數(shù)據(jù)I/O操作。Acceptor負責(zé)接受所以的連接通道并且注冊到Channel中。而整個過程客戶端與服務(wù)端是非阻塞的也就是異步操作。
下面是壓力測試對比:
服務(wù)器 | 命中 | 成功率 | 吞吐量 | 平均耗時 |
Jetty | 11488 | 100% | 96.25 trans/sec | 0.00sec |
18393 | 100% | 153.92 trans/sec | 0.01sec | |
21484 | 99.99% | 179.51 trans/sec | 0.01sec | |
Undertow | 11280 | 100% | 94.02 trans/sec | 0.00sec |
19442 | 100% | 163.35 trans/sec | 0.01sec | |
23277 | 100% | 195.54 tran/sec | 0.01sec | |
Tomcat | 10845 | 100% | 90.95 trans/sec | 0.02sec |
21673 | 99.98% | 181 trans/sec | 0.01sec | |
25084 | 99.98% | 209.10 trans/sec | 0.01sec |
從中可以看出在高負載下Undertow的吞吐量高于Jetty而且隨著壓力增大Jetty和Undertow成功率差距會拉大。而在負載不是太大情況下服務(wù)器處理能力差不多,jetty還略微高于Undertow。而tomcat的負載能力似乎和Undertow很接近。
對比三個服務(wù)器發(fā)現(xiàn)在Undertow在負載過重情況下比Jetty和Tocmat更加頑強,實踐證明在負載繼續(xù)加大情況下Undertow的成功率高于其它兩者,但是在并發(fā)不是太大情況下三款服務(wù)器整體來看差別不大。
快速開始
更新pom.xml文件:
<!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-web</artifactId>--> <!--</dependency>--> <!-- 下面的配置將使用undertow來做服務(wù)器而不是tomcat --> <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>
application.yml配置:
server: port: 8081 # 下面是配置undertow作為服務(wù)器的參數(shù) undertow: # 設(shè)置IO線程數(shù), 它主要執(zhí)行非阻塞的任務(wù),它們會負責(zé)多個連接, 默認設(shè)置每個CPU核心一個線程 io-threads: 4 # 阻塞任務(wù)線程池, 當(dāng)執(zhí)行類似servlet請求阻塞操作, undertow會從這個線程池中取得線程,它的值設(shè)置取決于系統(tǒng)的負載 worker-threads: 20 # 以下的配置會影響buffer,這些buffer會用于服務(wù)器連接的IO操作,有點類似netty的池化內(nèi)存管理 # 每塊buffer的空間大小,越小的空間被利用越充分 buffer-size: 1024 # 是否分配的直接內(nèi)存 direct-buffers: true
配置比較簡單,和tomcat使用基本一樣,然后就可以快樂的使用undertow啦~
undertow警告Buffer pool was not set on WebSocketDeploymentInfo
看提示讓你設(shè)置一下buffer pool,不然他就使用默認的
這個警告不影響使用,但是看著別扭,于是
根據(jù)官方文檔,和源碼,自定義配置
/** ?* 功能描述: ?* ?* @author liuchaoyong ?* @version 1.0 ?* @date 2019-05-26 21:41 ?*/ @Component public class CustomizationBean implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> { ? ? ? @Override ? ? public void customize(UndertowServletWebServerFactory factory) { ? ? ? ? factory.addDeploymentInfoCustomizers(deploymentInfo -> { ? ? ? ? ? ? WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); ? ? ? ? ? ? webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024)); ? ? ? ? ? ? deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); ? ? ? ? }); ? ? } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java客戶端線上Apollo服務(wù)端的實現(xiàn)
這篇文章主要介紹了java客戶端線上Apollo服務(wù)端的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Spring Cloud多個微服務(wù)之間調(diào)用代碼實例
這篇文章主要介紹了Spring Cloud多個微服務(wù)之間調(diào)用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12Kotlin基礎(chǔ)教程之伴生對象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)
這篇文章主要介紹了Kotlin基礎(chǔ)教程之伴生對象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)的相關(guān)資料,需要的朋友可以參考下2017-05-05netty?pipeline中的inbound和outbound事件傳播分析
這篇文章主要為大家介紹了netty?pipeline中的inbound和outbound事件傳播分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04JAVA正則表達式及字符串的替換與分解相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識總結(jié),文章圍繞著JAVA正則表達式及字符串的替換與分解展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06