Jetty的工作原理解析
Jetty是目前最活跃也是很有前景的一个Servlet引擎
Jetty的基本架构
Jetty的架构比较简单,也是可扩展性强且非常灵活的应用服务器。基本的数据模型是Handler,所有可以被扩展的组件都可作为一个Handler添加到Server中,Jetty管理这些Handler。
Jetty基本架构简介
整个Jetty核心由Server和Connector两个组件构成,Server组件是基于Handler容器工作的,类似于Tomcat的Container容器。
整个Jetty的所有组件的生命周期管理是基于观察者模板设计的,和Tomcat的管理类似。
Handler的体系结构
Jetty主要是基于Handler来设计的,Handler的体系结构影响着整个Jetty的方方面面。
Handler类型有两种:
- HandlerWrapper:将Handler委托给另一个类执行,配合ScopeHandler类可以拦截Handler的执行。
- HandlerCollection:这个Handler类可以将多个Handler组装成一起,构成一个Handler链。
Jetty的启动过程
Jetty的入口是Server类,Server类启动完成就代表Jetty可提供服务了。
- 首先启动设置到Server的Handler(有很多子Handler)
- 这些Handler将组成一个Handler链
- Server会启动链上所有的Handler
- 最后启动Connector,打开端口,接受客户端请求。
接受请求
Jetty作为独立的Servlet引擎,可独立提供Web服务器,也可与其他Web应用服务器集成,分别基于HTTP和AJP协议。
如将Jetty集成到JBoss或者Apache,那可让Jetty基于AJP模式工作。
基于HTTP工作
如前端没其他Web服务器,Jetty应给予HTTP工作,当Jetty接受一个请求时,必须按照HTTP解析请求和封装返回的数据。
Jetty创建接受连接的环境:
- 创建一个队列线程池,用于处理每个建立连接的任务
- 创建ServerSocket,用于接收客户端的Socket请求
- 创建一个或多个监听线程
基于AJP工作
通常的Web服务站点的后端服务器不是将Java的应用服务器直接暴露给服务访问者,而是在前面再加一个Web服务器。原因是做日志分析、负载均衡、权限控制和静态资源预加载等
基于NIO方式工作
创建一个Selector相当于一个观察者打开一个Server端通道,把这个Server通道注册到观察者并且监听事件,然后遍历观察者观察者观察到的事件,取出感兴趣的事件在处理。核心是能够统一的管理每个被观察者的事件。
与JBoss集成
JBoss是基于JMX的架构,只要符合JMX规范的系统或框架可以作为组件加到JBoss中,扩展JBoss的功能。
Jetty作为独立的Servlet引擎集成到JBoss需要集成JBoss的AbstractWebContainer类,实现的是模板模式。
与Tomcat的比较
- 从架构上Jetty比Tomcat更加简单;
- Tomcat在处理少数非常繁忙的连接上更有优势;Jetty可以同时处理大量连接而且长时间保持这些连接。
- Jetty默认使用NIO技术,在处理I/O请求上更占优势,Tomcat默认使用的是BIO,在处理静态资源时,Tomcat的性能较差