Jetty 服务器架构分析(上)

系统 1767 0

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

Jetty 服务器架构分析(上)

C onnector 负责监听接收客户连接请求,而 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 接口来控制,我们来看下,类图结构:

Jetty 服务器架构分析(上)

c onnector,handler 等组件全部都直接或间接实现了 LifeCyle 接口,刚才说了 Server 也是 Handler ,同时他也是启动或协调组件工作的类,也就是说 Server 可以通过 LifeCyle 接口控制其他组件的生命周期,通过 start 方法可以启动 server, 通过 stop 则关闭了 server

二、 Connector 组件

Jetty 服务器架构分析(上)

Connnetor 在实现上有 NIO BIO 两种实现方式,并且支持 AJP 协议、和 SSL

三、 Handler 组件

Jetty 服务器架构分析(上)

所有的 handler 组件都实现了 Handler 接口,可以看到, Handler 是可以以链表的形式相互组合的, Server 作为服务入口,本身也是 handler ,他继承了 HandlerWrapper 接口,我们看以看到他带了一个 handler 的引用变量,我们可以注入 ServletHandler 支持 servlet, 注入 WebAppContext 则支持我们的 webapp 应用。

四、 启动过程

先看下 jetty 的目录结构

Jetty 服务器架构分析(上)

看几个主要目录的含义,

Bin 目录定义了启动 jetty 需要的 sh 文件,主要用在 linux 中, windows 中可以直接 java start.jar 启动服务器,

Contexts 目录主要放置跟应用相关的 context 配置文件,跟应用相关

etc 目录放置跟服务器相关的配置文件,其中会定义 contexts 目录所在的位置

lib 是服务器所需要的 jar

webapps 是放置应用程序的位置,当然也可以通过在 contexts 中或者 etc 中自定义

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

Jetty 服务器架构分析(上)

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

Jetty 服务器架构分析(上)

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

Jetty 服务器架构分析(上)

这个文件的配置是需要有一定的语法在里面的,有兴趣的可以研究一下,也就是说,通过在 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 方法启动这些组件。

==========================

未完待续.....

Jetty 服务器架构分析(上)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论