Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程
Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理。需要解决的问题有监听、协议以及处理器映射等等。
一、Connector设计
Connector要实现的主要功能如下:
设计图如下:
1、ProtocolHandler
Connector中的ProtocolHandler用于处理不同的通信协议,Tomcat主要支持HTTP、AJP协议,并且支持BIO、NIO、APR等I/O方式。ProtocolHandler中使用AbstractEndpoint启动Socket监听,并且根据不同的I/O方式进行分类,例如NIO2Endpoint.
获取到客户端Socket之后,需要根据请求地址映射到具体的容器进行处理。
2、映射规则实现
在获取到客户端的请求之后,需要根据请求地址映射到具体的容器中进行处理,主要是通过Mapper以及MapperListener两个类实现映射功能。
Mapper:维护容器映射信息。
MappListener:实现了ContainerListener以及LifecycleListener接口,在容器组件状态发生变更时,注册或者取消对应的容器映射信息。
因此到目前为止,Tomcat的架构图如下所示:
到目前为止,还没有考虑到并发的问题,在客户端大量请求的情况下,使用多线程技术是必不可少的,至于多线程为啥效率高?啥时候用多线程?使用多线程有啥注意事项?自行百度。。。。
Tomcat提供了Executor接口,用于组件中的共享线程池,并且该接口集成了Lifecycle接口。Executor由Service维护,一个Service中的所有容器都可以共享此Executor。加入线程池后的Tomcat结构图如下:
二、Tomcat启动
Tomcat通过Catalina类来启动Tomcat容器,Catalina提供了shell程序,用于解析server.xml文件,负责启动、关闭Tomcat容器。另外Tomcat提供了Bootstrap类作为启动的入口,Bootstrap创建一个Catalina实例。
为啥有了Catalina还需要Bootstrap呢?因为Bootstrap依赖JRE,并通过反射调用Catalina实例,与Tomcat容器是松耦合的。并且为Tomcat创建共享类加载器,构造整个Tomcat服务器。
Tomcat启动过程如下:
请求处理过程如下:
三、Catalina
Catalina其实就是Tomcat的servlet容器的实现,是Tomcat的核心,基于Servlet的web应用都需要servlet容器才能对外提供服务,例如SpringMVC等框架也是基于servlet。
1、Digester
Digester是将xml转变为java对象的工具,是对sax的高层次的封装。工作原理就是通过流来读取xml文件,当碰到特定的xml节点执行特定的处理规则,一般为创建对象或是调用对象的某个方法。
加上xml中的标签都是成对出现的,如下所示:
<a...>
<b...>
<c...>
</c...>
</b...>
</a...>
假设各个节点当中的处理规则都是创建对象,当Digester解析到a节点时,创建a对象,等到识别到</a>标签时,此创建a对象的动作才算是完成。因此这里跟JVM中的方法执行是非常相似的,先进后出,因此Digester也是使用的栈结构来解析各个xml文件。
当识别到<a>标签时,将a对象放入到栈中,然后一直执行b、c标签中的各个动作,当创建b对象时,则把b对象放入栈顶,如此循环,b对象创建完毕后,则调用a对象的某个方法,将b对象作为参数放入a中,最后识别到</a>标签时,将对象从整个栈中移除,
因此最终的结果是得到一个对象树,并且子对象与父对象的关系也配置完成。常见的栈操作则如下所示:
四、创建Server
1、创建Server实例
首先通过Catalina创建Digester对象,通过Digester创建Server对象,默认的Server实现类为StandardServer,当然可以通过自行指定实现类。
a、addObjectCreate(String rule, String className, String attributeName)
设置节点与Java对象的映射规则,rule指定节点的筛选规则,className设置要创建的java类的名字,可以覆盖要创建的默认Java类名称。创建完对象后,放入栈顶。
b、addSetProperties(String rule)
此方法则是当遇到符合rule的节点时,将该节点中的属性值获取到,并根据反射将这些属性注入到当前栈顶的对象中;
eg:
<?xml version="1.0" encoding="UTF-8?>
<database>
<user userName="guest" password="guest">
</user>
</database>
digester.addSetProperties("database/user"),解析遇到user节点时,会获取键值对 userName=guest,password=guest,获得栈顶的dataBase对象,设置实例的userName、password属性;
c、addSetNext(String rule, String methodName)
设置当前rule节点与父节点的调用规则,当遇到rule节点时,调用栈中的次栈顶元素调用methodName方法。将栈顶元素作为次顶元素指定方法的输入参数。
比如:digester.addSetNext("database/user","addUser"),调用database实例的addUser,user为参数
2、创建企业命名上下文
3、为Server添加生命周期
4、构造Service实例
5、为Service添加生命周期
6、Service中添加Executor
7、为Service添加Connector
addRule(String rule, Rule ruler):当解析到rule节点时,使用ruler规则处理器进行处理
然后接下来就是为Connector添加虚拟主机SSL配置、Connector添加生命周期监听器、Connector添加升级协议、Connector添加子元素解析规则
接着后面就是Engine、Host、Context的解析,请关注后续博文~~~~~
Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程的更多相关文章
- Tomcat架构解析(一)-----Tomcat总体架构
Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server 1.最简单的服务器结构 最简单的服务器结构如图所示: ...
- Tomcat架构解析(三)-----Engine、host、context解析以及web应用加载
上一篇博文介绍了Server的创建,在Server创建完之后,就进入到Engine的创建过程,如下: 一.Engine的创建 1.创建Engine实例 当前次栈顶元素为Service对象,通过Se ...
- Tomcat架构解析(五)-----Tomcat的类加载机制
类加载器就是根据类的全限定名(例如com.ty.xxx.xxx)来获取此类的二进制字节流的代码模块,从而程序可以自己去获取到相关的类. 一.java中的类加载器 1.类加载器类别 java中的类加 ...
- Tomcat学习之二:tomcat安装、配置及目录文件说明
我们看到tomcat目录/bin文件夹里有个tomcat6w.exe,顾名思义就是tomcat以window方式显示控制台.第1次点击打开它时候,可能会提示:tomcat指定的服务未安装,此时我们可以 ...
- java中类的加载过程和对象的创建过程
1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...
- tomcat原理解析(二):整体架构
一 整体结构 前面tomcat实现原理(一)里面描述了整个tomcat接受一个http请求的简单处理,这里面我们讲下整个tomcat的架构,以便对整体结构有宏观的了解.tomat里面由很多个容器结合在 ...
- Tomcat架构解析(六)-----BIO、NIO、NIO2、APR
对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求 ...
- Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议
Connector是Tomcat中非常重要的一个组成部分,说白了,就是如何从客户端获取到相应的请求信息.这部分主要包括的难点有这样几个部分: 1.客户端与服务端的协议 客户端与服务端的协议是多种多样的 ...
- HBASE架构解析(二)
http://www.blogjava.net/DLevin/archive/2015/08/22/426950.html HBase读的实现 通过前文的描述,我们知道在HBase写时,相同Cell( ...
随机推荐
- 【转】web.xml配置项详解
史上最全web.xml配置文件元素详解 一.web.xml配置文件常用元素及其意义预览 1 <web-app> 2 3 <!--定义了WEB应用的名字--> 4 <d ...
- ionic创建工程中遇到异常、错误及解决方法
1. 创建工程——download failed ionic start myApp tabs 遇到如下错误 Downloading--Failed! Error:Timeout of 25000ms ...
- 【转】微信公众号h5网页被嵌入广告 不知道什么原因
这个是因为http劫持导致的.HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序 ...
- tomcat 启动日志乱码
打开cd到tomcat/conf/目录下 修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更改为 ...
- 组委会正在为美团点评CodeM大赛的决赛设计新赛制
比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分.比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 ...
- eclipse导入项目以后,内容没有错误,项目上却有个小红叉?
对于上面的错误,应该如何解决?
- java的eclipse的使用
1下载eclipse地址:www.eclipse.org/downloads/ 解压就可安装 注意: 这可能你是没有安装java运行环境(jre或jdk) 直接www.java.com,下载就行 下一 ...
- 关于js动画简单理解;
1.CSS样式提供了运动 过度的属性:transition 过度的属性值:attr ,time , liner , delay: 值分别是:属性(css),花费的时间,变化的速度(默认匀速), ...
- Eigen解线性方程组
一. 矩阵分解: 矩阵分解 (decomposition, factorization)是将矩阵拆解为数个矩阵的乘积,可分为三角分解.满秩分解.QR分解.Jordan分解和SVD(奇异值)分解等,常见 ...
- static ,const
函数原型作用域:作用范围为函数形参表范围,起始于“(”,结束于“)”,这是声明 定义是属于局部作用域,所以声明的时候不写形参名字也可以 类作用域:包含类体及在类外实现的本类成员函数的函数体 静态生存期 ...