吊打tomcat的高性能web服务器

一,undertow介绍

undertow.png

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

spring.png

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")
@ResponseBody
public 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次吞吐量数据

100线程tomat1次.png

100线程tomcat2次.png

100线程tomcat3次.png

1000线程循环100次吞吐量数据

1000线程tomcat1次.png

1000线程tomcat2次.png

1000线程tomcat3次.png
jetty
100线程循环1000次吞吐量数据

100线程jetty1次.png

100线程jetty2次.png

100线程jetty3次.png

1000线程循环100次吞吐量数据

1000线程jetty1次.png

1000线程jetty2次.png

1000线程jetty3次.png

undertow
100线程循环1000次吞吐量数据

100线程undertow1次.png

100线程undertow2次.png

100线程undertow3次.png

1000线程循环100次吞吐量数据

1000线程undertow1次.png

1000线程undertow2次.png

1000线程undertow3次.png

通过压测结果图统计如下

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

最后说一句

感谢您的阅读,您的正反馈是我持续创作的动力,十分期待欢迎您的关注!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享