Tomcat vs. Undertow

背景

在Java EE应用服务器中我们使用最多的是Tomcat,但是由Red Hat 公司开源并且JBoss赞助的嵌入式Undertow在性能和内存使用方面都优于Tomcat,那我们该如何抉择呢?

Tomcat

介绍

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成,Tomcat 是 Apache 基金下的一个轻量级的 Servlet 容器,支持 Servlet 和 JSP。Tomcat 具有 Web 服务器特有的功能,包括 Tomcat 管理和控制平台、安全局管理和 Tomcat 阀等。Tomcat 本身包含了 HTTP 服务器,因此也可以视作单独的 Web 服务器。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

特点

部署简单:Tomcat中的应用程序是一个WAR(WebArchive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包,只需将你的WAR放到Tomcat的Webapp目录下,Tomcat会自动检测到这个文件,并将其解压。另外Tomcat也提供了一个应用管理器,通过这个应用,辅助于Ftp,你可以在远程通过Web部署和撤销应用安全管理:安全管理Tomcat提供Realm支持。Realm类似于Unix里面的group。在Unix中,一个group对应着系统的一定资源,某个group不能访问不属于它的资源,通过Realm可以方便地对访问某个应用的客户进行验证。在Tomcat中,还可以利用Servlet2.提供的事件监听器功能,来对应用程序或者Session实行监听,进行身份权限控制。Tomcat也提供其他的一些特征,如与SSL集成到一块,实现安全传输。易操作:基于Tomcat的开发其实主要是JSP和Servlet的开发,开发JSP和Servlet非常简单,可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可集成方便:Tomcat也可以与其他一些软件集成起来实现更多的功能。如与JBoss集成起来开发EJB,与Cocoon(Apache的另外一个项目)集成起来开发基于XML的应用,与OpenJMS集成起来开发JMS应用。除了提到的这几种外,可以与Tomcat集成的软件还有很多

架构

Tomcat2个核心功能

处理 Socket 连接,负责网络字节流与 Request 和 Response 对象相互转化。加载和管理 Servlet,以及具体处理 Request 请求。

Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别来处理对外交流,内部处理。Tomcat中一个容器可能对接多个连接器,每一个连接器都对应某种协议某种IO模型,tomcat将单个容器和多个连接器组成一个service组件,一个tomcat中可能存在多个Service组件

Connector

将不同协议不同IO模型的请求转换为标准的标准的 ServletRequest 对象交给容器处理。Connector中三个核心组件:EndPoint,Processor,Adapter。

EndPoint组件:主要负责网络通信,这其中就包括,监听客户端连接创建于客户端连接的Socket,并负责连接Socket 接收和发送处理器Processor:主要负责根据具体应用层协议(HTTP/AJP)读取字节流解析成 Tomcat Request 和 Response,因此Processor是对应用层的抽象,是用来实现 HTTP/AJP 协议的Adapter:由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat 定义了自己的 Request 类来“存放”这些请求信息

Container

Container本质上是一个Servlet容器,负责servelt的加载和管理,处理请求ServletRequest,并返回标准的 ServletResponse 对象给连接器,tomcat 将Container容器按功能分为4个组件,分别是 Engine、Host、Context 和 Wrapper。这 4 种容器不是平行关系,而是父子关系。

Wrapper:表示一个 ServletContext:表示一个 Web 应用程序,一个 Web 应用程序中可能会有多个 ServletHost:表示的是一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序Engine:表示引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine。

Undertow

介绍

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

特点

非常轻量级,Undertow核心在1Mb以下。它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间。支持HTTP升级,允许多个协议通过HTTP端口进行多路复用。提供对Web套接字的全面支持,包括JSR-356支持。提供对嵌入式servlet的支持。还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序。可以嵌入在应用程序中或独立运行,只需几行代码。通过将处理程序链接在一起来配置Undertow服务器。它可以对各种功能进行配置,方便灵活底层基于 XNIO,和 Netty 设计类似,使用 NIO 作为网络交互的方式,并且使用直接内存作为网络传输的 buffer,减少业务的 GC。由于基于这种异步框架,所以配置也是交由链式Handler配置和处理请求,可以最小化按需加载模块,无须加载多余功能

架构

Undertow 是基于 Java XNIO,Java XNIO 是一个对于 JDK NIO 类的扩展,和 netty 的基本功能是一样的,但是 netty 更像是对于 Java NIO 的封装,Java XNIO 更像是扩展封装,Undertow的架构是组合式的,可以通过组合各种小型的目的单一的处理程序来构建Web服务器。所以可以很灵活地的选择完整的Java EE servlet 3.1容器或初级非阻塞程序处理,Undertow的设计是可以完全可嵌入的,具有简单易用的编译接口。Undertow的生命周期完全由嵌入的应用程序控制。重点需要理解,Undertow中没有任何容器的概念。Undertow应用程序是由多个处理程序组合而来的,它通过嵌入的方式来管理所有这些处理程序的生命周期。这是一个专门的设计决定,以便给予嵌入应用更多的控制权。当然这种设计会产生一个问题,如果你有处理程序,需要在服务器停止时清理一下它使用的资源。Undertow 服务器基本上由三部分组成,一个(或多个)XNIO 工作实例,一个或多个连接器,以及一个处理传入请求的处理程序链。

总结

在高并发系统中,Tomcat相对来说比较弱。在相同的机器配置下,模拟相等的请求数,Undertow在性能和内存使用方面都是最优的。并且Undertow新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow是最佳选择。而且Undertow支持嵌入式开发当然tomcat也支持嵌入式,但是对这对开发者有一定技术要求。对于并发性能要求不是特别高的话tomcat 完全可以胜任,且tomcat经过长时间优化也经得住考验,且使用tomcat 不用过多关注内部细节均有tomcat 自身来管理,这也是相比嵌入式的优势,由于tomcat优秀的稳定性以及丰富的文档资料,广泛的使用人群,从而在开源领域受到最广泛的青睐。