在 Java Web 容器的世界里,Tomcat 和 Jetty 是大名鼎鼎的、用的最多的开源项目,也是大众熟知的。
今天再介绍另外一款能和 Tomcat 媲美的神器:Undertow,据说性能方面还要吊打 Tomcat,如果你还不知道它,那你就 OUT 了。
我们来看下 Spring Boot 默认支持的三种 Servlet 容器:
Name | Servlet Version |
---|---|
Tomcat 9.0 | 4.0 |
Jetty 9.4 | 3.1 |
Undertow 2.0 | 4.0 |
以上来源于 Spring Boot 2.3.2 官方文档,更多信息请点击这里参考这篇文章。
Undertow 它能成为 Spring Boot 默认集成的三大容器之一,就凭这点,我想就足以说明它的地位。
Undertow 是 RedHat(红帽公司)的开源产品,采用 Java 开发,是一款灵活、高性能的 Web 服务器,提供了基于 NIO 的阻塞/非阻塞 APIs,也是 Wildfly 的默认 Web 容器。
搜索 Undertow:
页面显示的是 JBoss Community,因为 2006 年 RedHat 收购了 JBoss,那也就不足为怪了。
Undertow 它是一个基于组合的体系结构,可以通过组合一系列小型处理器来构建一个 Web 服务器。这就让我们可以灵活的在 Java EE servlet 4.0 容器和底层非阻塞处理器或者其他更多之间进行选择。
Undertow 被设计成完全可嵌入式的,所以也叫嵌入式容器,具有易于使用的流畅构建 API,另外,Undertow 的生命周期也完全由所嵌入的应用程序所控制。
这也是为什么 Spring Boot 可以直接嵌入 Undertow 的原因,Undertow 它就是为了嵌入而发烧的。Spring Boot 基础知识就不介绍了,关注公众号Java技术栈在后台回复boot获取我写的系列教程。
官方网站:
源码托管在 Github:
1)HTTP/2 Support
Undertow 支持 HTTP/2 开箱即用,不需要重写引导类路径。
2)支持 HTTP 升级
支持 HTTP 升级,允许多个协议通过 HTTP 端口上进行复用。
3)支持 Web Socket
Undertow 提供对 Web 套接字的全面支持,包括对 JSR-356 的支持。
4)支持 Servlet 4.0
Undertow 提供了对 Servlet 4.0 的支持,包括对嵌入式 Servlet 的支持,还可以混合部署 Servlet 和原生 Undertow 非阻塞处理程序。
5)可嵌入式
Undertow 可以嵌入到应用程序中,也可以通过几行代码独立运行。
6)高灵活性
一个 Undertow 服务器是通过链式处理器来配置的,可以根据需要添加功能,因此可以避免添加没有必要的功能。
国外有篇帖子做了 Tomcat vs. Jetty vs. Undertow 三者的性能比较:
从测试结果看,这三个 Servlet 容器都具有不错的性能,但 Undertow 性能更好,Tomcat 和 Jetty 紧随其后。
Jetty 在启动时的内存占用最大,为:311 MB, Tomcat 和 Undertow 的初始内存占用都很低,大约为:120 MB,而 Undertow 的初始内存占用最低,为:114 MB。
最后,关键的区别在于,Undertow 响应头参数默认包含 HTTP 持久连接信息,这个头参数在支持持久连接的客户端时,可以通过重用连接来优化性能。
Undertow 目前有两个主要版本:
独立使用 Undertow 需要添加以下依赖:
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
<version>2.1.0.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
<version>2.1.0.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
<version>2.1.0.Final</version>
</dependency>
以下示例来源官网:
public class HelloWorldServer {
public static void main(final String[] args) {
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Hello World");
}
}).build();
server.start();
}
}
这是一个使用了异常 IO 的简单 Hello World 示例。
上面讲到,Undertow 是为嵌入式而生的 Web 容器,又是 Spring Boot 默认集成的容器之一,下面栈长带大家来看下如何在 Spring Boot 中使用 Undertow。
因为在 spring-boot-starter-web
启动器中,Tomcat 是 Spring Boot 默认的嵌入式容器,即:spring-boot-starter-tomcat
。
Spring Boot 还提供了其他两个启动器以方便进行代替:
下面来简单实战下,如何在 Spring Boot 中使用 Undertow。Spring Boot 基础知识就不介绍了,不熟悉的可以关注公众号Java技术栈在后台回复boot获取我写的系列教程。
排除 Tomcat 依赖,然后加入 Undertow 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Undertow instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
一步就完成集成了,当然实际情况还需要在 application 配置文件中加入 Undertow 的更多自定义或者优化配置参数。
Undertow容器的具体配置可以看这两个类:
也可以看 Spring Boot 官方文档:
https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/htmlsingle/#server-properties
上面有所有 Server 配置参数和说明。
再写一个测试方法测试下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 微信公众号:Java技术栈
*/
@RestController
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@GetMapping(value = "/undertow/test")
public String undertow() {
return "hello undertow";
}
}
启动 Application:
如上所示,可以看到 Undertow 的启动日志。
访问测试方法:
输出成功,测试完成。
本文对 Undertow 作了一个介绍和集成实战,虽然 Undertow 性能很炸,但你可以去网上找一圈,根本没啥学习资料。
所以,对于学习和一般应用来说,Tomcat 足矣,一方面 Tomcat 学习资料多,另一方面 Tomcat 用的更广泛,很多坑别人帮你踩了,很多漏洞也已经暴露出来了。
那于那些一定要追求极致性能的又不想优化 Tomcat 的,可以考虑使用 Undertow,但同时你要有能力 Hold 住它,需要一定的积累经验,不然出一个问题你线上卡半天显然是不愿意看到的。
最后,网上很多文章说干掉 Tomcat 而要使用 Undertow 的,这就有点夸张,我只能呵呵了,持有保留意见,用啥都行,关键能不能用好。
推荐去我的博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
觉得不错,别忘了点赞+转发哦!
原文:https://www.cnblogs.com/javastack/p/13552577.html