1. 程式人生 > >SpringBoot2使用Undertow來提高應用效能(spring-boot-starter-undertow)

SpringBoot2使用Undertow來提高應用效能(spring-boot-starter-undertow)

Undertow

Undertow是一個Java開發的靈活的高效能Web伺服器,提供包括阻塞和基於NIO的非阻塞機制。Undertow是紅帽公司的開源產品,是Wildfly預設的Web伺服器。
SpringBoot2中可以將Web伺服器切換到Undertow來提高應用效能。

Untertow 的特點

  • Servlet4.0 支援:它提供了對 Servlet4.0 的支援。
  • WebSocket 支援:對 Web Socket 完全支援,包括JSR-356,用以滿足 Web 應用巨大數量的客戶端。
  • 巢狀性:它不需要容器,只需通過 API 即可快速搭建 Web 伺服器。
  • 靈活性:交由鏈式Handler配置和處理請求,可以最小化按需載入模組,無須載入多餘功能。
  • 輕量級:它是一個 Web 伺服器,但不像傳統的 Web 伺服器有容器概念,它由兩個核心 Jar 包組成,載入一個 Web 應用可以小於 10MB 記憶體。

Untertow 的效能

預設情況下 Spring Cloud 使用 Tomcat 作為內嵌 Servlet 容器,可啟動一個 Tomcat 的 Spring Boot 程式與一個 Undertow 的 Spring Boot 程式,通過 VisualVM 工具進行比較,可看到 Undertow 效能優於 Tomcat。
在這裡插入圖片描述
在這裡插入圖片描述

SpringBoot2啟用Undertow

第一步,排除Tomcat依賴。
第二部,新增Undertow依賴。

		<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>

        <!-- 新增 Undertow依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

缺少包導致的報錯

如果你的undertow也會這樣:

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call the method io.undertow.servlet.api.DeploymentInfo.addServletContainerInitializer(Lio/undertow/servlet/api/ServletContainerInitializerInfo;)Lio/undertow/servlet/api/DeploymentInfo; but it does not exist. Its class, io.undertow.servlet.api.DeploymentInfo, is available from the following locations:

    jar:file:/C:/Users/Administrator/.m2/repository/io/undertow/undertow-servlet/1.4.25.Final/undertow-servlet-1.4.25.Final.jar!/io/undertow/servlet/api/DeploymentInfo.class

It was loaded from the following location:

    file:/C:/Users/Administrator/.m2/repository/io/undertow/undertow-servlet/1.4.25.Final/undertow-servlet-1.4.25.Final.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of io.undertow.servlet.api.DeploymentInfo

請加上以下maven依賴。因為我的SpringBoot2.0.7會這樣。

<!-- https://mvnrepository.com/artifact/io.undertow/undertow-core -->
        <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>

執行成功

在這裡插入圖片描述