Jetty源码学习2-应用服务器架构

半世苍凉 提交于 2019-12-19 00:05:03

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

引言

该文主要参考了玄霄的分享,感觉他分享的比较细。

应用服务器目录结构


由于需要用到jetty的websocket开发,因此选用的版本是8.1.7,从上图可以看到,主要有下面几个主要目录:

1、bin目录

启动脚本的目录,也包括了start.jar,主要是用来起引导作用的,引导资源加载和服务的启动。

2、etc目录

配置文件的目录,也包括了start.ini,这份配置文件是用来指导start.jar的加载顺序和加载模块的,这个后面会有详解。

3、lib目录

库文件目录,如果需要调试jetty的话,可以下载源码加到eclipse中,客户端远程调试即可,命令: java -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8090 -DEOS_DEBUG=true -jar start.jar 

4、webapps目录

应用部署目录

应用服务器启动流程

1、【流程图】


2、【start.jar】

可以看到,最后将server启动起来了,而jetty最核心的即server类,学习jetty的同学不防直接从server类的doStart()或者handle(...)入手。

3、【server.start

这几段代码说明了一个服务器最重要的几个模块分别是:


都很抽象了有木有,那我们来点实际的,看看jetty服务器是如何的,下面是jetty.xml的配置:


其实服务器的架构大同小异,最基本的4个组件总是不可或缺的,最后一个deployService是用来管理和部署应用的,他管理可以部署的工程类型,并管理着每个工程部署的生命周期。

4、【deployService】


管理了三类工程的部署,扫描工程的部署目录,匹配部署器,并执行工程的部署,到此,大致流程应如此:

5、【HttpService】

感觉该service才是最重要的模块,也是应用服务器设计的瓶颈所在。

顾名思义,为每个连接起个线程去处理,当然TomCat默认采用BIO,而Jetty默认是NIO,关于JETTY NIO的详细描述见后面的文章。

WebModule

你可曾想过,要实现servlet规范,一个web应用的WebModule需要哪些东西才能正常运作,可以服务用户的请求。

应该需要classloader来加载应用的资源,还需要context来指导server识别自己,还需要servlet,还需要filter,还需要初始化方法和请求的hanlder方法,最后需要制造request和response的方法等,如下图,因此产生了该web模型:

个人感觉是服务器驱动了servlet规范的产生,如果你要更方便理解的话,可以等价于webdefault.xml。

然后一个web部署器管理了一个webModule集:

接下来看看WebModule是如何处理一次请求的:



代码片段如下:

Jetty架构

注:默认的是NIO而不是BIO

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!