在Spring?Boot使用Undertow服務(wù)的方法
在Spring Boot使用Undertow服務(wù)
1.undertow簡介
Undertow是RedHAT紅帽公司開源的產(chǎn)品,采用JAVA開發(fā),是一款靈活,高性能的web服務(wù)器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默認Web容器。在javaweb容器的世界里,Tomcat和jetty是大眾熟知的,undertow目前逐步進入大眾的視角,它是一款能和tomcat媲美的神器,在性能方面吊打tomcat。目前Undertow已經(jīng)成為springboot 默認集成的三大容器之一。
2.undertow特點
undertow在高并發(fā)業(yè)務(wù)場景中,性能優(yōu)于tomcat
高性能,在多款同類產(chǎn)品的壓測對比中,高并發(fā)情況下表現(xiàn)出色。Servlet4.0支持,它提供了對Servlet4.0的支持。Web Socket完全支持,包含JSR-356,用以滿足Web應(yīng)用巨大數(shù)量的客戶端。內(nèi)嵌式,它不需要容器,只需要通過api即可快速搭建Web服務(wù)器。靈活性,交由鏈式Handler配置和處理請求,可以最小化按需加載模塊,無須加載多余功能。輕量級,它是一個內(nèi)嵌Web服務(wù)器,由兩個核心jar包組成。 3.springboot集成的web服務(wù)器
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
</parent>
<groupId>com.konne</groupId>
<artifactId>push-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>push-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除掉默認支持的 Tomcat -->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>配置啟動成功顯示如下信息:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.4)2022-12-13 09:41:21.625 INFO 2416 --- [ main] com.konne.pushdemo.PushDemoApplication : Starting PushDemoApplication using Java 1.8.0_202 on 2F-KF03 with PID 2416 (D:\i-word\push-demo\target\classes started by Administrator in D:\i-word\push-demo)
2022-12-13 09:41:21.628 INFO 2416 --- [ main] com.konne.pushdemo.PushDemoApplication : No active profile set, falling back to 1 default profile: "default"
2022-12-13 09:41:22.226 WARN 2416 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2022-12-13 09:41:22.241 INFO 2416 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext
2022-12-13 09:41:22.241 INFO 2416 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 578 ms
2022-12-13 09:41:22.482 INFO 2416 --- [ main] io.undertow : starting server: Undertow - 2.2.19.Final
2022-12-13 09:41:22.486 INFO 2416 --- [ main] org.xnio : XNIO version 3.8.7.Final
2022-12-13 09:41:22.490 INFO 2416 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.8.7.Final
2022-12-13 09:41:22.514 INFO 2416 --- [ main] org.jboss.threads : JBoss Threads version 3.1.0.Final
2022-12-13 09:41:22.544 INFO 2416 --- [ main] o.s.b.w.e.undertow.UndertowWebServer : Undertow started on port(s) 8080 (http)
2022-12-13 09:41:22.552 INFO 2416 --- [ main] com.konne.pushdemo.PushDemoApplication : Started PushDemoApplication in 1.217 seconds (JVM running for 1.807)
SpringBoot使用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ù)器整體來看差別不大。
從中可以看出在高負載下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啦~
到此這篇關(guān)于在Spring Boot使用Undertow服務(wù)的文章就介紹到這了,更多相關(guān)Spring Boot使用Undertow服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用JPA+querydsl如何實現(xiàn)多條件動態(tài)查詢
這篇文章主要介紹了使用JPA+querydsl如何實現(xiàn)多條件動態(tài)查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Mybatis-Plus之ID自動增長的設(shè)置實現(xiàn)
本文主要介紹了Mybatis-Plus之ID自動增長的設(shè)置實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java使用synchronized修飾方法來同步線程的實例演示
synchronized下的方法控制多線程程序中的線程同步非常方便,這里就來看一下Java使用synchronized修飾方法來同步線程的實例演示,需要的朋友可以參考下2016-06-06

