大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

前言

在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。

同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢?本文将为大家细细讲解。

SpringBoot中的Tomcat容器

SpringBoot可以说是目前最火的Java Web框架了。它将开发者从繁重的xml解救了出来,让开发者在几分钟内就可以创建一个完整的Web服务,极大的提高了开发者的工作效率。Web容器技术是Web项目必不可少的组成部分,因为任Web项目都要借助容器技术来运行起来。

在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。

SpringBoot设置Undertow

对于Tomcat技术,Java程序员应该都非常熟悉,它是Web应用最常用的容器技术。我们最早的开发的项目基本都是部署在Tomcat下运行,那除了Tomcat容器,SpringBoot中我们还可以使用什么容器技术呢?

没错,就是题目中的Undertow容器技术。SrpingBoot已经完全继承了Undertow技术,我们只需要引入Undertow的依赖即可,如下图所示。

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

配置好以后,我们启动应用程序,发现容器已经替换为Undertow。

那我们为什么需要替换Tomcat为Undertow技术呢?

Tomcat与Undertow的优劣对比

Tomcat是Apache基金下的一个轻量级的Servlet容器,支持Servlet和JSP。Tomcat具有Web服务器特有的功能,包括 Tomcat管理和控制平台、安全局管理和Tomcat阀等。Tomcat本身包含了HTTP服务器,因此也可以视作单独的Web服务器。

但是,Tomcat和ApacheHTTP服务器不是一个东西,ApacheHTTP服务器是用C语言实现的HTTP Web服务器。Tomcat是完全免费的,深受开发者的喜爱。

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

Undertow是Red Hat公司的开源产品, 它完全采用Java语言开发,是一款灵活的高性能Web服务器,支持阻塞IO和非阻塞IO。由于Undertow采用Java语言开发,可以直接嵌入到Java项目中使用。同时, Undertow完全支持Servlet和Web Socket,在高并发情况下表现非常出色。

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

我们在相同机器配置下压测Tomcat和Undertow,得到的测试结果如下所示:

QPS测试结果对比:

Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

Undertow

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

内存使用对比:

Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

Undertow

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

通过测试发现,在高并发系统中,Tomcat相对来说比较弱。在相同的机器配置下,模拟相等的请求数,Undertow在性能和内存使用方面都是最优的。并且Undertow新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow是最佳选择。

最后

SpingBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。Undertow在高并发业务场景中,性能优于Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下Undertow,你会发现你的系统性能会得到很大的提升。


一,undertow介绍

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

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

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

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次吞吐量数据

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

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

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

jetty

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

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

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

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

undertow

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

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

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

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

大公司为什么禁止SpringBoot项目使用Tomcat?为什么说吊打Tomcat

通过压测结果图统计如下

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 条评论) “”
   
验证码:

相关文章

推荐文章