Servlet, Tomcat, Jetty, Netty, Mina 它们都是什么?

这些是 Java Web 当中经常听到的几个名词,那么这些名词的定义是什么?它们之间的关系是什么呢?本文就此展开讨论。

结论

先说结论吧: Servlet是一种Java EE规范,Tomcat & Jetty是Servlet容器,Tomcat包含了Servlet。Servlet本身并不能处理外部请求,需要Servlet容器的配合,Netty和MINA是网络框架,我们可以使用Netty造出自己类似Tomcat的web服务器。简单的关系的话 Tomcat = Jetty > Netty & MINA > Servlet。

Servlet

wiki上的定义:

Servlet 是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。


Tomcat

wiki的定义:

Tomcat 是由 Apache 软件基金会下属的 Jakarta 项目开发的一个 Servlet 容器,按照 Sun Microsystems 提供的技术规范,实现了对 Servlet 和 JavaServer Page(JSP) 的支持,并提供了作为 Web 服务器的一些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 阀等。由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是一个用C语言实现的 HTTPWeb服务器;这两个 HTTP web server 不是捆绑在一起的。Apache Tomcat 包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。

wiki 上跟进的很快也改成 Jakarta 了。


Jetty

wiki的定义:

Jetty是一个纯粹的基于Java的网页服务器和Java Servlet容器。尽管网页服务器通常用来为人们呈现文档,但是Jetty通常在较大的软件框架中用于计算机与计算机之间的通信。Jetty作为Eclipse基金会的一部分,是一个自由和开源项目。该网页服务器被用在Apache ActiveMQ[2]、Alfresco[3]、Apache Geronimo[4]、Apache Maven、Apache Spark、Google App Engine[5]、Eclipse[6]、FUSE[7]、Twitter’s Streaming API[8]、Zimbra[9]等产品上。Jetty也是Lift、Eucalyptus、Red5、Hadoop、I2P等开源项目的服务器。[10] Jetty支持最新的Java Servlet API(带JSP的支持),支持SPDY和WebSocket协议。


Netty

wiki的定义:

Netty is a non-blocking I/O client-server framework for the development of Java network applications such as protocol servers and clients. The asynchronous event-driven network application framework and tools are used to simplify network programming such as TCP and UDP socket servers.[2] Netty includes an implementation of the reactor pattern of programming.

翻译如下:

Netty是一个基于NIO客户端-服务端框架,提供给诸如协议服务端与客户端的Java网络应用。异步事件驱动网络应用框架和工具用来简化TCP和UDP网络编程。Netty包括了一种响应式编程的实现。


Mina

wiki的定义:

Apache MINA (Multipurpose Infrastructure for Network Applications)[1] is an open source Java network application framework. MINA can be used to create scalable, high performance network applications. MINA provides unified APIs for various transports like TCP, UDP, serial communication. It also makes it easy to make an implementation of custom transport type. MINA provides both high-level and low-level network APIs.

翻译如下

Apache MINA 是一个开源Java网络应用框架。MINA可以创建表现良好的网络应用。MINA为各中通讯机制比如TCP,UDP提供统一的API。并且也可以很方便的实现一个自定义通讯方案。MINA提供高层和底层的API。


关系

Servlet 一种规范

Servlet是并不是对网络服务器的封装,而是JEE规范当中的一个。所以它可以支持多层用户协议。

Tomcat & Jetty 轻量级服务器

它们俩是同一级别的,都是Servlet容器。对于Servlet容器的工作机制这里有一篇很棒的blog Servlet 工作原理解析

Netty & MINA 网络编程框架

Netty是基于NIO的,Netty也像wiki介绍中说的Netty在很多大型项目中使用,之前文章中的 ElasticSearch transport也使用了Netty。MINA也是NIO框架,和Netty处于同一级别。下面是它们的区别:

  1. mina比netty出现的早,都是Trustin Lee的作品;
  2. mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性3的时候无法脱离,相比下性能会有所下降;netty解决了这个设计问题;
  3. netty的文档更清晰,很多mina的特性在netty里都有;
  4. netty更新周期更短,新版本的发布比较快;
  5. 它们的架构差别不大,mina靠apache生存,而netty靠jboss,和jboss的结合度非常高,netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
  6. netty比mina使用起来更简单,netty里你可以自定义的处理upstream events 或/和 downstream events,可以使用decoder和encoder来解码和编码发送内容;
  7. netty和mina在处理UDP时有一些不同,netty将UDP无连接的特性暴露出来;而mina对UDP进行了高级层次的抽象,可以把UDP当成”面向连接”的协议,而要netty做到这一点比较困难。mina把TCP和UDP一样当”有连接”的处理,一个UDP请求会按照address产生一个新的 IoSession,过期时间是1分钟,这样做的好处是显然的,但是对于有性能要求的项目就不好了,对一个无连接的东西cache 1分钟,大多数时候可能是白cache了,做无用功。 Mina这样做可能还有个初衷是连续解码用的,比如一个包太大了,分了两次传输;但是这样的设计应该是udp大忌了。