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的解析,请关注后续博文~~~~~

原文地址:https://www.cnblogs.com/alimayun/p/10611862.html

时间: 2024-10-03 09:37:45

Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程的相关文章

tomcat架构解析:Catalina+Coyote+Jasper+配置管理+集群+调优等

在目前流行的互联网架构中,对一个应用来说,Tomcat是首,SSM是中,JVM是尾,我们通常对于SSM是比较了解的,而忽略了首尾,而Tomcat在目前的网络编程中是举足轻重的,但是我们其实对Tomcat中很多原理性的东西不太了解,如果能够掌握Tomcat的原理,那么是非常有用的,比如: 如果我们能弄清楚Tomcat和Socket.Tcp之间的关系,我们就能明白Tomcat为什么会出现端口冲突.如果我们能准确的知道Tomcat中部署一个项目的N种方式,那么就能在工作中更加得心应手.Tomcat中热

终于有人把tomcat讲清楚了!阿里大牛推荐的tomcat架构解析文档

在目前流行的互联网架构中,对一个应用来说,Tomcat是首,SSM是中,JVM是尾,我们通常对于SSM是比较了解的,而忽略了首尾,而Tomcat在目前的网络编程中是举足轻重的,但是我们其实对Tomcat中很多原理性的东西不太了解,如果能够掌握Tomcat的原理,那么是非常有用的,比如: 如果我们能弄清楚Tomcat和Socket.Tcp之间的关系,我们就能明白Tomcat为什么会出现端口冲突.如果我们能准确的知道Tomcat中部署一个项目的N种方式,那么就能在工作中更加得心应手.Tomcat中热

Tomcat学习之二:tomcat安装、配置及目录文件说明

我们看到tomcat目录/bin文件夹里有个tomcat6w.exe,顾名思义就是tomcat以window方式显示控制台.第1次点击打开它时候,可能会提示:tomcat指定的服务未安装,此时我们可以这样解决它. 打开命令行提示符窗口-> 进入Tomcat安装目录-> 进入bin目录下-> 输入:service.bat install 即可,如图操作,tomcat目录按自己电脑上的来即可 <!--[endif]--> 这样就可以让tomcat以window方式显示控制台.点击

Tomcat架构解析(三)-----Engine、host、context解析以及web应用加载

上一篇博文介绍了Server的创建,在Server创建完之后,就进入到Engine的创建过程,如下: 一.Engine的创建   1.创建Engine实例 当前次栈顶元素为Service对象,通过Service对象的setContainer()方法,将Engine对象添加到Service中. 2.为Engine添加集群配置 3.为Engine添加生命周期监听器 4.为Engine添加安全配置 二.Host的创建   1.创建Host的实例 addCallMethod(String rule,St

tomcat原理解析(二):整体架构

一 整体结构 前面tomcat实现原理(一)里面描述了整个tomcat接受一个http请求的简单处理,这里面我们讲下整个tomcat的架构,以便对整体结构有宏观的了解.tomat里面由很多个容器结合在一起,主要有server,service,context,host,engine,wrapper,connector这7个容器来组装.当然了tomcat里面还有其它容器这里就不一一列举,因为我只看重点的.这7个容器存着父子关系,即可以通过当前容器找自己的父容器和自己的子容器.说到这我画了一个简单的结

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Connector是Tomcat中非常重要的一个组成部分,说白了,就是如何从客户端获取到相应的请求信息.这部分主要包括的难点有这样几个部分: 1.客户端与服务端的协议 客户端与服务端的协议是多种多样的,Tomcat肯定不能仅仅支持HTTP协议 2.数据I/O方式 I/O通常有NIO.BIO等多种方式,如何提高数据传输的效率? 一.Coyote   1.Coyote简介 Tomcat中的Connector就是Coyote,功能主要是封装了底层的网络通信.为Catalina容器提供了统一的接口,使容

Tomcat架构解析(六)-----BIO、NIO、NIO2、APR

对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求: 2.减少网络传输的数据量,提高网络利用率: 3.降低新建网络链接的开销,以实现链接在多个请求之间的复用: 4.选择合适的I/O方式,例如NIO等. 一.阻塞与非阻塞.同步与异步 ------同步:发出一个调用时,没有得到结果之前,该调用不返回,由调用者主动等待调用结果. | 关注的是消息通信机制

HBASE架构解析(二)

http://www.blogjava.net/DLevin/archive/2015/08/22/426950.html HBase读的实现 通过前文的描述,我们知道在HBase写时,相同Cell(RowKey/ColumnFamily/Column相同)并不保证在一起,甚至删除一个Cell也只是写入一个新的Cell,它含有Delete标记,而不一定将一个Cell真正删除了,因而这就引起了一个问题,如何实现读的问题?要解决这个问题,我们先来分析一下相同的Cell可能存在的位置:首先对新写入的C

tomcat 安装实例(二) 配置tomcat监听80端口

vim /usr/local/tomcat/conf/server.xml           #编辑TOMCAT的配置文件 搜索8080 如果发现80端口被其他web程序占用了, 关闭它