Jetty
基本架构:
Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个
可扩展性和非常灵活的应用服务器。它有一个基本数据模型,这个数据模型就
是 Handler(处理器),所有可以被扩展的组件都可以作为一个 Handler,添
加到 Server 中,Jetty 就是帮你管理这些 Handler。Jetty 中另外一个比不可少
的组件是 Connector,它负责接受客户端的连接请求,并将请求分配给一个处
理队列去执行。
下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个
组件构成,整个 Server 组件是基于 Handler 容器工作的,它类似与 Tomcat 的
Container 容器。
Jetty 中还有一些可有可无的组件,我们可以在它上做扩展。如 JMX,我们可以定义一些
Mbean 把它加到 Server 中,当 Server 启动的时候,这些 Bean 就会一起工作。
从上图可以看出整个 Jetty 的核心是围绕着 Server 类来构建,Server 类继承了 Handler,
关联了 Connector 和 Container,Container 是管理 Mbean 的容器。
整个 Jetty 的所有组件的生命周期管理是基于观察者模板设计,它和 Tomcat 的管理是类似的。
jetty 的体系结构:
前面所述 Jetty 主要是基于 Handler 来设计的,Handler 的体系结构影响着
整个 Jetty 的方方面面。下面总结了一下 Handler 的种类及作用:
Jetty 主要提供了两种 Handler 类型,一种是 HandlerWrapper,它可以将一
个 Handler 委托给另外一个类去执行,如我们要将一个 Handler 加到 Jetty 中,
那么就必须将这个 Handler 委托给 Server 去调用。配合 ScopeHandler 类我们
可以拦截 Handler 的执行,在调用 Handler 之前或之后,可以做一些另外的事情,
类似于 Tomcat 中的 Valve(阀门);另外一个 Handler 类型是 HandlerCollection,
这个 Handler 类可以将多个 Handler 组装在一起,构成一个 Handler 链,方便我们做扩展。
Jetty与 Tomcat 的比较:
Tomcat 和 Jetty 都是作为一个 Servlet 引擎应用的比较广泛,可以将它们
比作为中国与美国的关系,虽然 Jetty 正常成长为一个优秀的 Servlet 引擎,
但是目前的Tomcat 的地位仍然难以撼动。相比较来看,它们都有各自的优点
与缺点。
Tomcat 经过长时间的发展,它已经广泛的被市场接受和认可,相对 Jetty
来说 Tomcat 还是比较稳定和成熟,尤其在企业级应用方面,Tomcat 仍然是
第一选择。但是随着 Jetty 的发展,Jetty 的市场份额也在不断提高,至于原因
就要归功与 Jetty 的很多优点了,而这些优点也是因为 Jetty 在技术上的优势
体现出来的。
架构上的比较:
从架构上来说,显然 Jetty 比 Tomcat 更加简单,Jetty 的架构从前面的分析可知,
它的所有组件都是基于 Handler 来实现,当然它也支持 JMX。但是主要的功能扩
展都可以用 Handler 来实现。可以说 Jetty 是面向 Handler 的架构,就像 Spring
是面向 Bean 的架构,iBATIS 是面向 statement 一样,而 Tomcat 是以多级容器
构建起来的,它们的架构设计必然都有一个“元神”,所有以这个“元神“构建的其它
组件都是肉身。
性能上的比较:
单纯比较 Tomcat 与 Jetty 的性能意义不是很大,只能说在某种使用场景下,它表现
的各有差异。因为它们面向的使用场景不尽相同。从架构上来看 Tomcat 在处理少数
非常繁忙的连接上更有优势,也就是说连接的生命周期如果短的话,Tomcat 的总体
性能更高。
而 Jetty 刚好相反,Jetty 可以同时处理大量连接而且可以长时间保持这些连接。例如
像一些 web 聊天应用非常适合用 Jetty 做服务器,像淘宝的 web 旺旺就是用 Jetty 作
为 Servlet 引擎。
另外由于 Jetty 的架构非常简单,作为服务器它可以按需加载组件,这样不需要的组件
可以去掉,这样无形可以减少服务器本身的内存开销,处理一次请求也是可以减少产生
的临时对象,这样性能也会提高。另外 Jetty 默认使用的是 NIO 技术在处理 I/O 请求上
更占优势,Tomcat 默认使用的是 BIO,在处理静态资源时,Tomcat 的性能不如 Jetty。
特性上的比较:
作为一个标准的 Servlet 引擎,它们都支持标准的 Servlet 规范,还有 Java EE 的规范也
都支持,由于 Tomcat 的使用的更加广泛,它对这些支持的更加全面一些,有很多特性
Tomcat 都直接集成进来了。但是 Jetty 的应变更加快速,这一方面是因为 Jetty 的开发社
区更加活跃,另一方面也是因为 Jetty 的修改更加简单,它只要把相应的组件替换就好了,
而 Tomcat 的整体结构上要复杂很多,修改功能比较缓慢。所以 Tomcat 对最新的 Servlet
规范的支持总是要比人们预期的要晚。