使用 Undertow 來替代Tomcat


undertow

概述 :

Undertow 是紅帽公司開發的一款基於 NIO 的高性能 Web 嵌入式服務器

特點 :

輕量級:它是一個 Web 服務器,但不像傳統的 Web 服務器有容器概念,它由兩個核心 Jar 包組成,加載一個 Web 應用可以小於 10MB 內存

Servlet3.1 支持:它提供了對 Servlet3.1 的支持

WebSocket 支持:對 Web Socket 完全支持,用以滿足 Web 應用巨大數量的客戶端

嵌套性:它不需要容器,只需通過 API 即可快速搭建 Web 服務器

Spring Boot項目中的引入方式 :

Spring Boot 內嵌 Jetty , Tomcat , Undertow , 默認是Tomcat

pom.xml配置

添加如下依賴

 <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>
            <version>1.5.10.RELEASE</version>
        </dependency>

如果你啟動報錯的話,在添加下面的依賴

 <dependency>
            <groupId>io.undertow</groupId>
            <artifactId>undertow-core</artifactId>
            <version>2.0.16.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.undertow/undertow-servlet -->
        <dependency>
            <groupId>io.undertow</groupId>
            <artifactId>undertow-servlet</artifactId>
            <version>2.0.16.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.undertow/undertow-websockets-jsr -->
        <dependency>
            <groupId>io.undertow</groupId>
            <artifactId>undertow-websockets-jsr</artifactId>
            <version>2.0.16.Final</version>
        </dependency>

 application.yml

# 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特點

  • 高性能 在多款同類產品的壓測中,在高並發情況下表現出色。
  • Servlet4.0 支持 它提供了對 Servlet4.0 的支持。
  • Web Socket 完全支持,包括JSR-356,用以滿足 Web 應用巨大數量的客戶端。
  • 內嵌式 它不需要容器,只需通過 API 即可快速搭建 Web 服務器。
  • 靈活性 交由鏈式Handler配置和處理請求,可以最小化按需加載模塊,無須加載多余功能。
  • 輕量級 它是一個 內嵌Web 服務器, 由兩個核心 Jar 包組成

總結

其實在並發量不大的情況下 Undertow、和其它兩款 Servlet Web 容器 JettyTomcat 的差距並不是很大。 Undertow 的優勢是高並發下的吞吐量。你可以根據自己的實際需要來選擇。

QPS測試結果對比:

Tomcat

Undertow

內存使用對比:

Tomcat

Undertow

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM