jetty浅析

jetty

Jetty是一个servlet引擎,主要有2个核心组件:
server组件和connector组件。
整个server组件是基于handler容器工作的,类似Tomcat的container容器。
connector组件负责接收客户端的连接请求并将请求分配给一个处理队列去执行。
Jetty所有组件的生命周期管理基于观察者模式。
Jetty启动过程:jetty入口是server类,server类启动完了,jetty就可以提供服务了。
具体提供哪些服务,得看server类启动时调用了哪些组件的start方法,这些组件是在Jetty配置文件里配置到server上的。
server的start方法调用所有注册到server的组件,server启动其他组件的顺序是:
首先启动设置到server的Handler,这个Handler会有很多子Handler,这些Handler将组成一个Handler链,server会依次启动这个链上的所有Handler,接着会启动注册在server上的JMX的Mbean,让MBean也一起工作,最后启动connector打开端口,接受请求。

Jetty的工作过程大致如下:
1.启动jetty服务器,监听指定的端口,如80端口,等待客户端的连接请求;
2.收到客户端的连接请求时,与客户端建立TCP连接;
3.接收客户端的数据,然后根据协议(如HTTP,AJP等)解析数据内容,将数据转换成Servlet可识别的ServletRequest对象;
4.通过URL找到对应的Servlet,将ServletRequest转交给Servlet处理;
5.将Servlet的处理结果(ServletResponse对象)组装成协议报文返回给客户端。

Jetty做为一个独立的servlet引擎可以独立提供Web服务,但是它也可以与其它Web应用服务器集成。所以它可以提供基于两种协议工作。
一个是HTTP,一个是AJP协议。
如果将Jetty集成到JBoss或者Apache,那么就可以让Jetty基于AJP模式工作。

jetty基本架构

它由Server,Connector,Handler,ThreadPool着四个部分组成,其中:

1.Server代表一个Jetty服务器对象,它的作用就好象一个插线板,把Connector、Handler和ThreadPool集成在一起让它们协同起来工作。

2.Connector是连接器,它负责建立连接。当Connector接收到一个请求后,产生一个新的HttpConnection对象,然后由Server对象调用Handler来处理HttpConnection对象。HttpConnection类就是解析Http协议的地方,它提供了附属的Request对象和Response对象。Connector和Connectioin是紧密相关的,如果一个Connector要识别特定的协议,那么就必须对应一个Connection实现。

3.Handler是处理器,负责处理连接请求,输出响应。

4.ThreadPool是线程池,负责管理和调度多个线程,用来服务与HTTP connections和Handler的运行。

要让Jetty服务器工作起来,我们首先初始化一个Server对象实例,然后给它注册一个或多个Connector对象实例、注册一个ThreadPool对象、注册多个Handler对象并让这些Handler组合起来,这样一个Jetty服务器便组装完成了。

基于AJP工作

通常一个web服务站点的后端服务器不是将java的应用服务器直接暴露给服务访问者,而是在应用服务器,如JBoss的前面再加一个web服务器,如Apache或者nginx,这个原因一般有日志分析、负责均衡、权限控制、防止恶意请求以及静态资源预加载等
下面是通常的web服务器端的架构图:
这里写图片描述
这种架构下,servlet引擎就不需要解析和封装返回的HTTP协议,因为HTTP协议的解析工作已经在Apache或Nginx服务器上完成了。JBoss只有基于简单的AJP协议工作就可以了,加速请求的响应速度。
对比HTTP协议,两者的逻辑几乎是相同的,不同的是替换了一个类 Ajp13Parsse而不是HttpParser,它定义了如何处理AJP协议以及需要哪些类来配合。
AJP处理请求相比较HTTP时唯一的不同就是在读取到socket数据包时,如何来转换这个数据包。
按照HTTP协议的包格式来解析就是HttpParser。按照AJP协议来解析就是Ajp13Parser。封装返回也是如此。

让Jetty工作在AJP协议下,需要配置connector的实现类为Ajp13SocketConnector这个类继承了SocketConnector类,覆盖了父类的newConnection方法,为的是创建Ajp13Connection对象而不是HttpConnection。这样会使用Ajp13Parser类来解析AJP协议。
链接:jetty源码解析https://www.skyreal.me/jetty-yuan-ma-fen-xi/