疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Jetty 核心架构分析


 

    Jetty Server是由一组接受Http连接的Connectors和一组处理来自连接的请求并响应的Handlers构成的,其工作是通过取自线程池中的线程来完成的。
    Jetty的实现遵循一些标准的模式,大部分的抽象概念通过接口捕获的,比如Connector,Handler,Buffer。这些接口的通用处理通过抽象类来实现,比如AbstractConnector,AbstractHandler。从JSR77的生命周期得到灵感,大部分的Jetty组件是通过LifeCycle接口呈现的,其抽象实现(AbstractLifeCycle)是大部分Jetty组件的基础。
    Jetty是由一个或多少Connector?核心组件以及一些列Handler?组件和一个线程池组成,看一下结构图:
     Connector负责监听接收客户连接请求,而Handler组件则负责处理请求并给予响应,前面两个组件工作所需要的线程资源都直接从线程池ThreadPool中获取。Jetty Server可以有多个Connector在不同的端口上监听客户请求,而每个connector根据具体的使用场景不同可以有不同的实现,例如采用非阻塞NioConnector、阻塞SocketConnector等等,而对于请求处理的handler组件,也根据具体需要可以使用不同的Handler,此种设计提高了jetty的灵活性,需要Servlet,则可以使用ServletHandler,需要Session,则再增加一个SessionHandler,也就是说我们完全可以不使用Servlet或者Session,只要不配置这个Handler就行了。
要启动和协调上诉核心组件工作,Jetty提供了一个Server来做这个事情,也就是说Server是应用的起始点,他负责创建并初始化Connector、Handler、ThreadPool组件,然后调用start方法启动他们,让所有组件都处于待命状态,因此Server类是一个比较重要的Fa ade,值得注意的Server类本身也是一个handler.
一、组件生命周期
 
    对于Jetty来说,每个组件都有其生命周期,Jetty采用了统一的LifeCyle接口来控制,我们来看下,类图结构:
Connector,Handler等组件全部都直接或间接实现了LifeCyle接口,刚才说了Server也是Handler,同时他也是启动或协调组件工作的类,也就是说Server可以通过LifeCyle接口控制其他组件的生命周期,通过start方法可以启动Server,通过stop则关闭了Server。
二、Connector组件
 
    Connnetor在实现上有NIO、BIO两种实现方式,并且支持AJP协议、和SSL。
三、Handler组件
 
    所有的handler组件都实现了Handler接口,可以看到,Handler是可以以链表的形式相互组合的,Server作为服务入口,本身也是Handler,他继承了HandlerWrapper接口,我们看以看到他带了一个handler的引用变量,我们可以注入ServletHandler支持Servlet,注入WebAppContext则支持我们的webapp应用。