【推荐】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
来源:oschina
链接:https://my.oschina.net/u/947581/blog/110448