SpringBoot2使用Undertow來提高應用效能(spring-boot-starter-undertow)
阿新 • • 發佈:2018-12-26
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>