吊打 Tomcat ,Undertow 性能很炸!!
在 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 什么鬼?
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:
Undertow 有啥特性?
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 服务器是通过链式处理器来配置的,可以根据需要添加功能,因此可以避免添加没有必要的功能。
Undertow 性能如何?
国外有篇帖子做了 Tomcat vs. Jetty vs. Undertow 三者的性能比较:

从测试结果看,这三个 Servlet 容器都具有不错的性能,但 Undertow 性能更好,Tomcat 和 Jetty 紧随其后。
Jetty 在启动时的内存占用最大,为:311 MB, Tomcat 和 Undertow 的初始内存占用都很低,大约为:120 MB,而 Undertow 的初始内存占用最低,为:114 MB。
最后,关键的区别在于,Undertow 响应头参数默认包含 HTTP 持久连接信息,这个头参数在支持持久连接的客户端时,可以通过重用连接来优化性能。
Show me the code
Undertow 目前有两个主要版本:
- 2.1:当前支持 Servlet 4.0, JDK8+ 的稳定版本;
- 1.4:当前支持 Servlet 3.1, JDK7 的稳定版本;
独立使用 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 示例。
Spring Boot & Undertow
上面讲到,Undertow 是为嵌入式而生的 Web 容器,又是 Spring Boot 默认集成的容器之一,下面栈长带大家来看下如何在 Spring Boot 中使用 Undertow。
因为在 spring-boot-starter-web 启动器中,Tomcat 是 Spring Boot 默认的嵌入式容器,即:spring-boot-starter-tomcat。
Spring Boot 还提供了其他两个启动器以方便进行代替:
- spring-boot-starter-jetty
- spring-boot-starter-undertow
下面来简单实战下,如何在 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容器的具体配置可以看这两个类:
- org.springframework.boot.autoconfigure.web.ServerProperties
- org.springframework.boot.autoconfigure.web.ServerProperties.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 系列工具教程
觉得不错,别忘了点赞+转发哦!
吊打 Tomcat ,Undertow 性能很炸!!的更多相关文章
- Tomcat vs Jetty vs Undertow性能对比
Tomcat,Jetty和Undertow是目前比较主流的3款Servlet容器,而且Spring Boot框架还提供了对它们的集成支持(默认使用的是Tomcat),网络上有许多文章都在介绍Under ...
- Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现
Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现 Anoyi 精讲JAVA 精讲JAVA 微信号 toooooooozi 功能介绍 讲解java深层次 ...
- Tomcat 服务器性能优化
简介 考虑一下这种场景,你开发了一个应用,它有十分优秀的布局设计,最新的特性以及其它的优秀特点.但是在性能这方面欠缺,不管这个应用如何都会遭到客户拒绝.客户总是期望它们的应用应该有更好的性能.如果你在 ...
- Tomcat服务器性能优化
在这篇文章里分以下的七个步骤,按照这些步骤走,Tomcat服务器的性能就能改善哦. 增加JVM堆(heap) 解决内存泄漏问题 线程池(thread pool)的设置 压缩 调节数据库性能 Tomca ...
- myeclipse配置下tomcat debug启动很无比慢
myeclipse配置下tomcat debug启动很无比慢,而run启动很快今天照常使用MyEclipse 6.5 Blue Edition进行开发,但是却遇到一个怪问题.在MyEclipse环境下 ...
- CentOS7 Tomcat 启动过程很慢,JVM上的随机数与熵池策略
1. CentOS7 Tomcat 启动过程很慢 在centos启动官方的tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的: <co ...
- TOMCAT之性能跟踪入门
先扫清前面的障碍,再慢慢进入核心 转一下网上的我关心的话题,实施起来 ~~~ 使用Nginx作为反向代理时,Tomcat的日志记录的客户端IP就不在是真实的客户端IP,而是Nginx代理的IP.要解决 ...
- 提升tomcat服务器性能的七条经验
在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验. 1. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力 ...
- tomcat之性能优化
tomcat是我们常用的web容器,它的性能高低直接影响到应用对外提供服务的能力和用户的体验,所以tomcat的优化至关重要.对于单台tomcat服务器而言,优化主要是两方面:内存优化和配置优化(例如 ...
随机推荐
- Python os.unlink() 方法
概述 os.unlink() 方法用于删除文件,如果文件是一个目录则返回一个错误.高佣联盟 www.cgewang.com 语法 unlink()方法语法格式如下: os.unlink(path) 参 ...
- Python Tuple(元组) len()方法
描述 Python 元组 len() 函数计算元组元素个数.高佣联盟 www.cgewang.com 语法 len()方法语法: len(tuple) 参数 tuple -- 要计算的元组. 返回值 ...
- C/C++编程笔记:C++入门知识丨运算符重载
本篇要学习的内容和知识结构概览 运算符重载使用场景 常规赋值操作 我们现在有一个类 想要实现这种赋值操作 具体实现如下: 所以说呢,我们在使用运算符进行运算的时候, 实际上也是通过函数来实现运算的. ...
- CF Contest 526 G. Spiders Evil Plan 长链剖分维护贪心
LINK:Spiders Evil Plan 非常巧妙的题目. 选出k条边使得这k条边的路径覆盖x且覆盖的边的边权和最大. 类似于桥那道题还是选择2k个点 覆盖x那么以x为根做长链剖分即可. 不过这样 ...
- PyCharm2020激活破解教程
本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12767075.html 免责声明:本方法只做学习研究之用,不得用于商业用途 若经 ...
- 数据量大了一定要分表,分库分表组件Sharding-JDBC入门与项目实战
最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...
- 一文打尽Java抽象类和接口的相关问题
相关文章: <面向对象再探究>:介绍了面向对象的基本概念 <详解Java的对象创建>:介绍了对象的创建.构造器的使用 <一文打尽Java继承的相关问题>:介绍了继承 ...
- Python稳居编程语言榜首,看完这篇总结,你就明白为什么要学它了
最近,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的! Python被列入小学.初高中教材已不是新鲜事,现在又成功“入侵”了幼儿园,对此有网友调侃 ...
- Python自动化爬取App数据
基本环境配置 版本:Python3 系统:Windows 需要安装: 1.JDK - Download JDK,Appium要求用户必须配置JAVA环境, 否则启动Seesion报错. 很多人学习py ...
- 再见,付费录屏软件!我用70行Python代码打造免费版!