vlambda博客
学习文章列表

吊打tomcat的高性能web服务器

一,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服务器

吊打tomcat的高性能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版本

<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.2.2.RELEASE</version></parent>

2,测试类的controller

@RequestMapping("/reflect")@ResponseBodypublic void reflect() {    Object object = springReflectionUtil.springInvokeMethod("reflectService""handleUser");    if (object instanceof User) {         User invoke = (User)object;    }}

3,springboot默认就内嵌了tomcat

在pom文件中引入以下依赖
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>

4,项目整合undertow

在pom文件中引入以下依赖

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-undertow</artifactId></dependency><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>   <exclusions>    <exclusion>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-tomcat</artifactId>    </exclusion>   </exclusions></dependency>

5,项目整合jetty

在pom文件中引入以下依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>    <exclusions>      <exclusion>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-tomcat</artifactId>      </exclusion>    </exclusions></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jetty</artifactId></dependency>

6,jvm配置

-server-Xms4096m-Xmx4096m-XX:+UseG1GC

7,用jmeter压测

tomcat,jetty,undertow分别模拟10万请求,查看各自的吞吐量数据

场景一:100个线程 循环1000次请求测试接口,模拟10万请求

场景二:1000个线程 循环100次请求测试接口,模拟10万请求

8,实验结果

tomcat

100线程循环1000次吞吐量数据
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器


1000线程循环100次吞吐量数据
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器   
jetty
100线程循环1000次吞吐量数据
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器


1000线程循环100次吞吐量数据
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器


undertow

100线程循环1000次吞吐量数据
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器


1000线程循环100次吞吐量数据
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器
吊打tomcat的高性能web服务器

通过压测结果图统计如下

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


最后说一句

感谢您的阅读,您的正反馈是我持续创作的动力,十分期待欢迎您的关注!吊打tomcat的高性能web服务器