wslsg 发表于 2017-2-27 12:06:43

Jetty 服务器架构分析(上)

   以jetty7作为分析目标,Jetty是由一个或多个connector核心组件以及一些列handler组件和一个线程池组成,看一下结构图:

         Connector负责监听接收客户连接请求,而handler组件则负责处理请求并给予响应,前面两个组件工作所需要的线程资源都直接从线程池ThreadPool中获取。JettyServer 可以有多个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应用。
  
四、      启动过程
   先看下jetty的目录结构

看几个主要目录的含义,
Bin目录定义了启动jetty需要的sh文件,主要用在linux中,windows中可以直接java start.jar启动服务器,
Contexts目录主要放置跟应用相关的context配置文件,跟应用相关
etc 目录放置跟服务器相关的配置文件,其中会定义contexts目录所在的位置
lib是服务器所需要的jar包
webapps 是放置应用程序的位置,当然也可以通过在contexts中或者etc中自定义

我们从外部启动一个jetty服务器的过程:

首先从Start.jar开始,这个jar定义了解析命令行的Main这个类,Main主要负责解析start.ini配置文件,start.ini中定义了JVM需要的参数以及etc目录中用到的xml配置文件,如下图:






然后由Config类解析出stat.ini中OPTIONS选项指定的模块的包的位置用来加入到classpath中,这些模块的包都定义在start.config文件中(该文件可以在start.jar包中找到),截取一个片段给大家看下:

这个文件的配置是需要有一定的语法在里面的,有兴趣的可以研究一下,也就是说,通过在start.ini中定义OPTIONS以及在start.config中定义模块路径就可以确定把哪些jar加入到环境变量中。
         以上准备工作做完之后,就可以真正开始服务器的处理了,这时你有两种选择,第一种是在本进程中通过反射方式启动,但是缺点是start.ini中配置的JVM参数就形同虚设了,因为java进程已经起来了,不能再按照新的堆参数等重新设置了;第二种方式就是重新启动一个进程,就可以重新设置参数,前面说了,start.ini中得到了启动参数,start.config中有了MainClass和Classpath需要的jar包,则可以直接用java xxx方式启动了,要使用这种方式启动,只需要在start.ini中配置–exec 参数即可。
         MainClass默认是XmlConfigration类,当然自定义的话,可以在start.config中去更改,XmlConfigration做几件事情:1、根据start.ini中的定义的配置文件进行解析,例如etc/jetty.xml等 2、通过自己的IOC将这些服务组件组装在一起 3、最后调用start方法启动这些组件。


==========================
   未完待续.....
页: [1]
查看完整版本: Jetty 服务器架构分析(上)