SpringBoot使用Undertow做服務器


說明

        undertow,jetty和tomcat可以說是javaweb項目當下最火的三款服務器,tomcat是apache下的一款重量級的服務器,不用多說歷史悠久,經得起實踐的考驗。然而:當下微服務興起,spring boot ,spring cloud 越來越熱的情況下,選擇一款輕量級而性能優越的服務器是必要的選擇。spring boot 完美集成了tomcat,jetty和undertow,本文將通過對jetty和undertow服務器的分析以及測試,來比較兩款服務器的性能如何。

  值得一提的是jetty和undertow都是基於NIO實現的高並發輕量級的服務器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。

NIO(非阻塞式輸入輸出)

  • Channel
  • Selector
  • Buffer
  • Acceptor

  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很接近。

  對比三個服務器發現在Undertow在負載過重情況下比Jetty和Tocmat更加頑強,實踐證明在負載繼續加大情況下Undertow的成功率高於其它兩者,但是在並發不是太大情況下三款服務器整體來看差別不大。

快速開始

更新pom.xml文件:

  1. <!--<dependency>-->
  2. <!--<groupId>org.springframework.boot</groupId>-->
  3. <!--<artifactId>spring-boot-starter-web</artifactId>-->
  4. <!--</dependency>-->
  5.  
  6. <!-- 下面的配置將使用undertow來做服務器而不是tomcat -->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. <exclusions>
  11. <exclusion>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-tomcat</artifactId>
  14. </exclusion>
  15. </exclusions>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-undertow</artifactId>
  20. </dependency>

application.yml配置:

  1. server:
  2. port: 8081
  3. # 下面是配置undertow作為服務器的參數
  4. undertow:
  5. # 設置IO線程數, 它主要執行非阻塞的任務,它們會負責多個連接, 默認設置每個CPU核心一個線程
  6. io-threads: 4
  7. # 阻塞任務線程池, 當執行類似servlet請求阻塞操作, undertow會從這個線程池中取得線程,它的值設置取決於系統的負載
  8. worker-threads: 20
  9. # 以下的配置會影響buffer,這些buffer會用於服務器連接的IO操作,有點類似netty的池化內存管理
  10. # 每塊buffer的空間大小,越小的空間被利用越充分
  11. buffer-size: 1024
  12. # 是否分配的直接內存
  13. direct-buffers: true

配置比較簡單,和tomcat使用基本一樣,然后就可以快樂的使用undertow啦~


免責聲明!

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



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