SpringBoot如何使用Undertow做服務器
使用Undertow做服務器
說明
undertow,jetty和tomcat可以說是javaweb項目當下最火的三款服務器,tomcat是apache下的一款重量級的服務器,不用多說歷史悠久,經得起實踐的考驗。
然而:當下微服務興起,spring boot ,spring cloud 越來越熱的情況下,選擇一款輕量級而性能優(yōu)越的服務器是必要的選擇。
spring boot 完美集成了tomcat,jetty和undertow,本文將通過對jetty和undertow服務器的分析以及測試,來比較兩款服務器的性能如何。
值得一提的是jetty和undertow都是基于NIO實現的高并發(fā)輕量級的服務器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。
NIO(非阻塞式輸入輸出)
ChannelSelectorBufferAcceptor
Client和Server只向Buffer讀寫數據不關注數據的流向,數據通過Channel通道進行流轉。而Selector是存在與服務端的,用于Channel的注冊以此實現數據I/O操作。Acceptor負責接受所以的連接通道并且注冊到Channel中。而整個過程客戶端與服務端是非阻塞的也就是異步操作。
下面是壓力測試對比:
| 服務器 | 命中 | 成功率 | 吞吐量 | 平均耗時 |
| 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成功率差距會拉大。而在負載不是太大情況下服務器處理能力差不多,jetty還略微高于Undertow。而tomcat的負載能力似乎和Undertow很接近。
對比三個服務器發(fā)現在Undertow在負載過重情況下比Jetty和Tocmat更加頑強,實踐證明在負載繼續(xù)加大情況下Undertow的成功率高于其它兩者,但是在并發(fā)不是太大情況下三款服務器整體來看差別不大。
快速開始
更新pom.xml文件:
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-web</artifactId>-->
<!--</dependency>-->
<!-- 下面的配置將使用undertow來做服務器而不是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作為服務器的參數
undertow:
# 設置IO線程數, 它主要執(zhí)行非阻塞的任務,它們會負責多個連接, 默認設置每個CPU核心一個線程
io-threads: 4
# 阻塞任務線程池, 當執(zhí)行類似servlet請求阻塞操作, undertow會從這個線程池中取得線程,它的值設置取決于系統(tǒng)的負載
worker-threads: 20
# 以下的配置會影響buffer,這些buffer會用于服務器連接的IO操作,有點類似netty的池化內存管理
# 每塊buffer的空間大小,越小的空間被利用越充分
buffer-size: 1024
# 是否分配的直接內存
direct-buffers: true配置比較簡單,和tomcat使用基本一樣,然后就可以快樂的使用undertow啦~
undertow警告Buffer pool was not set on WebSocketDeploymentInfo
看提示讓你設置一下buffer pool,不然他就使用默認的
這個警告不影響使用,但是看著別扭,于是
根據官方文檔,和源碼,自定義配置
/**
?* 功能描述:
?*
?* @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);
? ? ? ? });
? ? }
}以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Kotlin基礎教程之伴生對象,getter,setter,內部,局部,匿名類,可變參數
這篇文章主要介紹了Kotlin基礎教程之伴生對象,getter,setter,內部,局部,匿名類,可變參數的相關資料,需要的朋友可以參考下2017-05-05
netty?pipeline中的inbound和outbound事件傳播分析
這篇文章主要為大家介紹了netty?pipeline中的inbound和outbound事件傳播分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

