在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。
同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢?本文将为大家细细讲解。
SpringBoot可以说是目前最火的Java Web框架了。它将开发者从繁重的xml解救了出来,让开发者在几分钟内就可以创建一个完整的Web服务,极大的提高了开发者的工作效率。Web容器技术是Web项目必不可少的组成部分,因为任Web项目都要借助容器技术来运行起来。
在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。
对于Tomcat技术,Java程序员应该都非常熟悉,它是Web应用最常用的容器技术。我们最早的开发的项目基本都是部署在Tomcat下运行,那除了Tomcat容器,SpringBoot中我们还可以使用什么容器技术呢?
没错,就是题目中的Undertow容器技术。SrpingBoot已经完全继承了Undertow技术,我们只需要引入Undertow的依赖即可,如下图所示。
配置好以后,我们启动应用程序,发现容器已经替换为Undertow。
那我们为什么需要替换Tomcat为Undertow技术呢?
Tomcat是Apache基金下的一个轻量级的Servlet容器,支持Servlet和JSP。Tomcat具有Web服务器特有的功能,包括 Tomcat管理和控制平台、安全局管理和Tomcat阀等。Tomcat本身包含了HTTP服务器,因此也可以视作单独的Web服务器。
但是,Tomcat和ApacheHTTP服务器不是一个东西,ApacheHTTP服务器是用C语言实现的HTTP Web服务器。Tomcat是完全免费的,深受开发者的喜爱。
Undertow是Red Hat公司的开源产品, 它完全采用Java语言开发,是一款灵活的高性能Web服务器,支持阻塞IO和非阻塞IO。由于Undertow采用Java语言开发,可以直接嵌入到Java项目中使用。同时, Undertow完全支持Servlet和Web Socket,在高并发情况下表现非常出色。
我们在相同机器配置下压测Tomcat和Undertow,得到的测试结果如下所示:
QPS测试结果对比:
Tomcat
Undertow
内存使用对比:
Tomcat
Undertow
通过测试发现,在高并发系统中,Tomcat相对来说比较弱。在相同的机器配置下,模拟相等的请求数,Undertow在性能和内存使用方面都是最优的。并且Undertow新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow是最佳选择。
SpingBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。Undertow在高并发业务场景中,性能优于Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下Undertow,你会发现你的系统性能会得到很大的提升。
1,undertow简介:
Undertow是RedHAT红帽公司开源的产品,采用java开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器。在javaweb容器的世界里,tomcat和jetty是大众熟知的,undertow目前逐步进入大众的视角,它是一款能和tomcat媲美的神器,在性能方面吊打tomcat。目前Undertow已经成为springboot 默认集成的三大容器之一。,
2,undertow特点:
undertow在高并发业务场景中,性能优于tomcat
1,高性能,在多款同类产品的压测对比中,高并发情况下表现出色。
2,Servlet4.0支持,它提供了对Servlet4.0的支持。
3,Web Socket完全支持,包含JSR-356,用以满足Web应用巨大数量的客户端。
4,内嵌式,它不需要容器,只需要通过api即可快速搭建Web服务器。
5,灵活性,交由链式Handler配置和处理请求,可以最小化按需加载模块,无须加载多余功能。
6,轻量级,它是一个内嵌Web服务器,由两个核心jar包组成。
3,springboot集成的web服务器
2.2.13.RELEASE springboot版本默认支持的三种Servlet容器版本如下
2.2.13.RELEASE springboot版本(官网提供的) | |
Web服务器 | 集成版本 |
Undertow | 2.0.33.Final |
tomcat | 9.0.41 |
jetty | 4.1.17 |
实验准备材料如下:
1,springboot版本
org.springframework.boot
spring-boot-starter-parent
2.2.2.RELEASE
2,测试类的controller
@RequestMapping("/reflect")
@ResponseBody
public void reflect() {
Object object = springReflectionUtil.springInvokeMethod("reflectService", "handleUser");
if (object instanceof User) {
User invoke = (User)object;
}
}
3,springboot默认就内嵌了tomcat
在pom文件中引入以下依赖
org.springframework.boot
spring-boot-starter-web
4,项目整合undertow
在pom文件中引入以下依赖
org.springframework.boot
spring-boot-starter-undertow
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
5,项目整合jetty
在pom文件中引入以下依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-jetty
6,jvm配置
-server
-Xms4096m
-Xmx4096m
-XX:+UseG1GC
7,用jmeter压测
tomcat,jetty,undertow分别模拟10万请求,查看各自的吞吐量数据
场景一:100个线程 循环1000次请求测试接口,模拟10万请求
场景二:1000个线程 循环100次请求测试接口,模拟10万请求
8,实验结果
tomcat
100线程循环1000次吞吐量数据
1000线程循环100次吞吐量数据
jetty
100线程循环1000次吞吐量数据
1000线程循环100次吞吐量数据
undertow
100线程循环1000次吞吐量数据
1000线程循环100次吞吐量数据
通过压测结果图统计如下
100线程循环1000次(吞吐量/sec) | ||||
第一次 | 第二次 | 第三次 | 平均值 | |
Tomcat | 1119.7 | 1497.5 | 1490.5 | 1369.2 |
jetty | 1363.7 | 1429.3 | 1390.5 | 1394.5 |
undertow | 1607.9 | 1467.3 | 1545.6 | 1540.3 |
1000线程循环100次(吞吐量/sec) | ||||
第一次 | 第二次 | 第三次 | 平均值 | |
Tomcat | 1212.2 | 1088.4 | 1107.5 | 1136.0 |
jetty | 1225.9 | 1222.6 | 1186.3 | 1211.6 |
undertow | 1383.7 | 1468.1 | 1434.2 | 1428.7 |
100个线程循环1000次,都用默认配置,没有调配置参数情况下,tomcat的吞吐量平均是每秒1369.2,jetty的吞吐量平均是1394.5,undertow的吞吐量平均是每秒1540.3
1000个线程循环100次,都用默认配置,没有调配置参数情况下,tomcat的吞吐量平均是每秒1136.0,jetty的吞吐量是1211.6,undertow的吞吐量是每秒1428.7
可以看出,默认配置情况下,undertow的吞吐量领先于jetty和tomcat,表现更优异
undertow>jetty>tomcat
留言与评论(共有 0 条评论) “” |