引言 java
该文主要参考了玄霄的分享,感受他分享的比较细。 web
应用服务器目录结构 服务器
因为须要用到jetty的websocket开发,所以选用的版本是8.1.7,从上图能够看到,主要有下面几个主要目录: websocket
一、bin目录 架构
启动脚本的目录,也包括了start.jar,主要是用来起引导做用的,引导资源加载和服务的启动。 app
二、etc目录 eclipse
配置文件的目录,也包括了start.ini,这份配置文件是用来指导start.jar的加载顺序和加载模块的,这个后面会有详解。 webapp
三、lib目录 socket
库文件目录,若是须要调试jetty的话,能够下载源码加到eclipse中,客户端远程调试便可,命令: java -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8090 -DEOS_DEBUG=true -jar start.jar 学习
四、webapps目录
应用部署目录
应用服务器启动流程
一、【流程图】
二、【start.jar】
能够看到,最后将server启动起来了,而jetty最核心的即server类,学习jetty的同窗不防直接从server类的doStart()或者handle(...)入手。
三、【server.start】
这几段代码说明了一个服务器最重要的几个模块分别是:
都很抽象了有木有,那咱们来点实际的,看看jetty服务器是如何的,下面是jetty.xml的配置:
其实服务器的架构大同小异,最基本的4个组件老是不可或缺的,最后一个deployService是用来管理和部署应用的,他管理能够部署的工程类型,并管理着每一个工程部署的生命周期。
四、【deployService】
管理了三类工程的部署,扫描工程的部署目录,匹配部署器,并执行工程的部署,到此,大体流程应如此:
五、【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