吊打 Tomcat ,Undertow 性能很炸!!

简介: 吊打 Tomcat ,Undertow 性能很炸!!

在 Java Web 容器的世界里,Tomcat 和 Jetty 是大名鼎鼎的、用的最多的开源项目,也是大众熟知的。


今天再介绍另外一款能和 Tomcat 媲美的神器:Undertow,据说性能方面还要吊打 Tomcat,如果你还不知道它,那你就 OUT 了。


我们来看下 Spring Boot 默认支持的三种 Servlet 容器:image.png以上来源于 Spring Boot 2.3.2 官方文档,更多信息请点击这里参考这篇文章。


Undertow 它能成为 Spring Boot 默认集成的三大容器之一,就凭这点,我想就足以说明它的地位。


Undertow 什么鬼?

Undertow 是 RedHat(红帽公司)的开源产品,采用 Java 开发,是一款灵活、高性能的 Web 服务器,提供了基于 NIO 的阻塞/非阻塞 APIs,也是 Wildfly 的默认 Web 容器。


搜索 Undertow:

image.png页面显示的是 JBoss Community,因为 2006 年 RedHat 收购了 JBoss,那也就不足为怪了。


Undertow 它是一个基于组合的体系结构,可以通过组合一系列小型处理器来构建一个 Web 服务器。这就让我们可以灵活的在 Java EE servlet 4.0 容器和底层非阻塞处理器或者其他更多之间进行选择。


Undertow 被设计成完全可嵌入式的,所以也叫嵌入式容器,具有易于使用的流畅构建 API,另外,Undertow 的生命周期也完全由所嵌入的应用程序所控制。


这也是为什么 Spring Boot 可以直接嵌入 Undertow 的原因,Undertow 它就是为了嵌入而发烧的。Spring Boot 基础知识就不介绍了,关注公众号Java技术栈在后台回复boot获取我写的系列教程。


官方网站:


https://undertow.io/


源码托管在 Github:


https://github.com/undertow-io/undertow


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 三者的性能比较:


https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-comparison-of-spring-boot-embedded-servlet-containers/image.pngimage.png从测试结果看,这三个 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 需要添加以下依赖:

image.png这是一个使用了异常 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 依赖:image.png一步就完成集成了,当然实际情况还需要在 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 配置参数和说明。


再写一个测试方法测试下:

image.pngimage.png如上所示,可以看到 Undertow 的启动日志。

访问测试方法:

http://localhost:8080/undertow/test

image.png输出成功,测试完成。


总结

本文对 Undertow 作了一个介绍和集成实战,虽然 Undertow 性能很炸,但你可以去网上找一圈,根本没啥学习资料。


所以,对于学习和一般应用来说,Tomcat 足矣,一方面 Tomcat 学习资料多,另一方面 Tomcat 用的更广泛,很多坑别人帮你踩了,很多漏洞也已经暴露出来了。


那于那些一定要追求极致性能的又不想优化 Tomcat 的,可以考虑使用 Undertow,但同时你要有能力 Hold 住它,需要一定的积累经验,不然出一个问题你线上卡半天显然是不愿意看到的。


最后,网上很多文章说干掉 Tomcat 而要使用 Undertow 的,这就有点夸张,我只能呵呵了,持有保留意见,用啥都行,关键能不能用好。


推荐去我的博客阅读更多:


1.Java JVM、集合、多线程、新特性系列教程


2.Spring MVC、Spring Boot、Spring Cloud 系列教程


3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程


4.Java、后端、架构、阿里巴巴等大厂最新面试题


觉得不错,别忘了点赞+转发哦!


相关文章
|
4月前
|
缓存 前端开发 JavaScript
tomcat核心技术+Nginx性能调优技术
而Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话
96 1
|
4月前
|
设计模式 网络协议 Java
Tomcat 高并发之道原理拆解与性能调优
Tomcat 高并发之道原理拆解与性能调优
79 0
|
4月前
|
存储 网络协议 Java
Tomcat详解(十)——Tomcat性能调优
Tomcat详解(十)——Tomcat性能调优
183 1
|
10月前
|
Java 应用服务中间件 测试技术
Tomcat压力测试tps性能下降问题
Tomcat压力测试tps性能下降问题
|
4月前
|
Java 应用服务中间件
优化tomcat的性能
优化tomcat的性能
|
4月前
|
架构师 Java 关系型数据库
一线架构师开发总结:剖析并发编程+JVM性能,深入Tomcat与MySQL
每一个程序员都有自己清晰的职业规划和终极目标,无论之后是继续钻研技术,还是转管理岗、产品岗,都是需要自己具备有一定的实力,换句话说技术要牛逼。架构师,是很多程序员的终极目标,而成为一名Java架构师,那就需要对自己自身有一定要求,不仅技术能力要过硬,还需要有组织能力和提出解决方案的能力。那么作为架构师,需要掌握哪些技术呢?
一线架构师开发总结:剖析并发编程+JVM性能,深入Tomcat与MySQL
|
消息中间件 监控 NoSQL
tomcat8和tomcat7性能比较
tomcat8和tomcat7性能比较
204 0
|
消息中间件 网络协议 小程序
Jetty、Netty、Tomcat、Undertow
Jetty、Netty、Tomcat、Undertow
472 0
|
应用服务中间件 Linux
【代码】Linux 安装Apr - 提高Tomcat 的可伸缩性和性能。
【代码】Linux 安装Apr - 提高Tomcat 的可伸缩性和性能。
98 0
【代码】Linux 安装Apr - 提高Tomcat 的可伸缩性和性能。
|
监控 Java 应用服务中间件
美团动态线程池思路开源框架(DynamicTp),动态调整Tomcat、Jetty、Undertow线程池参数篇
大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数调整,监控告警这些增强功能。
815 1
美团动态线程池思路开源框架(DynamicTp),动态调整Tomcat、Jetty、Undertow线程池参数篇