SpringBoot如何使用Undertow做服務(wù)器
使用Undertow做服務(wù)器
說(shuō)明
undertow,jetty和tomcat可以說(shuō)是javaweb項(xiàng)目當(dāng)下最火的三款服務(wù)器,tomcat是apache下的一款重量級(jí)的服務(wù)器,不用多說(shuō)歷史悠久,經(jīng)得起實(shí)踐的考驗(yàn)。
然而:當(dāng)下微服務(wù)興起,spring boot ,spring cloud 越來(lái)越熱的情況下,選擇一款輕量級(jí)而性能優(yōu)越的服務(wù)器是必要的選擇。
spring boot 完美集成了tomcat,jetty和undertow,本文將通過(guò)對(duì)jetty和undertow服務(wù)器的分析以及測(cè)試,來(lái)比較兩款服務(wù)器的性能如何。
值得一提的是jetty和undertow都是基于NIO實(shí)現(xiàn)的高并發(fā)輕量級(jí)的服務(wù)器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。
NIO(非阻塞式輸入輸出)
ChannelSelectorBufferAcceptor
Client和Server只向Buffer讀寫(xiě)數(shù)據(jù)不關(guān)注數(shù)據(jù)的流向,數(shù)據(jù)通過(guò)Channel通道進(jìn)行流轉(zhuǎn)。而Selector是存在與服務(wù)端的,用于Channel的注冊(cè)以此實(shí)現(xiàn)數(shù)據(jù)I/O操作。Acceptor負(fù)責(zé)接受所以的連接通道并且注冊(cè)到Channel中。而整個(gè)過(guò)程客戶(hù)端與服務(wù)端是非阻塞的也就是異步操作。
下面是壓力測(cè)試對(duì)比:
| 服務(wù)器 | 命中 | 成功率 | 吞吐量 | 平均耗時(shí) |
| 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 |
從中可以看出在高負(fù)載下Undertow的吞吐量高于Jetty而且隨著壓力增大Jetty和Undertow成功率差距會(huì)拉大。而在負(fù)載不是太大情況下服務(wù)器處理能力差不多,jetty還略微高于Undertow。而tomcat的負(fù)載能力似乎和Undertow很接近。
對(duì)比三個(gè)服務(wù)器發(fā)現(xiàn)在Undertow在負(fù)載過(guò)重情況下比Jetty和Tocmat更加頑強(qiáng),實(shí)踐證明在負(fù)載繼續(xù)加大情況下Undertow的成功率高于其它兩者,但是在并發(fā)不是太大情況下三款服務(wù)器整體來(lái)看差別不大。
快速開(kāi)始
更新pom.xml文件:
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-web</artifactId>-->
<!--</dependency>-->
<!-- 下面的配置將使用undertow來(lái)做服務(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ù),它們會(huì)負(fù)責(zé)多個(gè)連接, 默認(rèn)設(shè)置每個(gè)CPU核心一個(gè)線程
io-threads: 4
# 阻塞任務(wù)線程池, 當(dāng)執(zhí)行類(lèi)似servlet請(qǐng)求阻塞操作, undertow會(huì)從這個(gè)線程池中取得線程,它的值設(shè)置取決于系統(tǒng)的負(fù)載
worker-threads: 20
# 以下的配置會(huì)影響buffer,這些buffer會(huì)用于服務(wù)器連接的IO操作,有點(diǎn)類(lèi)似netty的池化內(nèi)存管理
# 每塊buffer的空間大小,越小的空間被利用越充分
buffer-size: 1024
# 是否分配的直接內(nèi)存
direct-buffers: true配置比較簡(jiǎn)單,和tomcat使用基本一樣,然后就可以快樂(lè)的使用undertow啦~
undertow警告Buffer pool was not set on WebSocketDeploymentInfo
看提示讓你設(shè)置一下buffer pool,不然他就使用默認(rèn)的
這個(gè)警告不影響使用,但是看著別扭,于是
根據(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);
? ? ? ? });
? ? }
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
圖解Java中插入排序算法的原理與實(shí)現(xiàn)
插入排序的算法描述是一種簡(jiǎn)單直觀的排序算法。它的工作原理是通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將通過(guò)圖片詳解插入排序的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08
一招教你使用Java執(zhí)行g(shù)roovy腳本的兩種方式
本文主要介紹了一招教你使用Java執(zhí)行g(shù)roovy腳本的兩種方式,一種是通過(guò)腳本引擎ScriptEngine提供的eval(String)方法執(zhí)行腳本內(nèi)容,一種是執(zhí)行g(shù)roovy腳本,感興趣的可以了解一下2023-09-09
簡(jiǎn)單的java圖片處理類(lèi)(圖片水印 圖片縮放)
本圖片處理類(lèi)功能非常之強(qiáng)大可以實(shí)現(xiàn)幾乎所有WEB開(kāi)發(fā)中對(duì)圖像的處理功能都集成了,包括有縮放圖像、切割圖像、圖像類(lèi)型轉(zhuǎn)換、彩色轉(zhuǎn)黑白、文字水印、圖片水印等功能2013-11-11
Java語(yǔ)法基礎(chǔ)之選擇結(jié)構(gòu)的if語(yǔ)句、switch語(yǔ)句詳解
這篇文章主要為大詳細(xì)介紹了Java語(yǔ)法基礎(chǔ)之選擇結(jié)構(gòu)的if語(yǔ)句、switch語(yǔ)句,感興趣的小伙伴們可以參考一下2016-09-09
Java面試為何阿里強(qiáng)制要求不在foreach里執(zhí)行刪除操作
那天,小二去阿里面試,面試官老王一上來(lái)就甩給了他一道面試題:為什么阿里的 Java 開(kāi)發(fā)手冊(cè)里會(huì)強(qiáng)制不要在 foreach 里進(jìn)行元素的刪除操作2021-11-11
SpringBoot項(xiàng)目中使用Sharding-JDBC實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟
Sharding-JDBC是一個(gè)分布式數(shù)據(jù)庫(kù)中間件,它不僅支持?jǐn)?shù)據(jù)分片,還可以輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)分離,本文介紹如何在Spring Boot項(xiàng)目中集成Sharding-JDBC并實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟,需要的朋友可以參考下2024-08-08

