1.TomCat总体结构

TomCat有两大核心组件:Connector和Container。Connector组件是可以被替换的,一个Container可以对应多个Connector。

多个Connector和一个Container就形成了Service。而Service的生存环境就是Server。所以整个TomCat生命周期由Server控制。

Connector主要负责对外交流,而Container主要处理Connector接受的请求,主要处理内部事务。


Service:

TomCat中Service接口的标准实现类是StandardService,它还实现了Lifecycle接口(后面会提到这个接口)。

重要的两个方法:

1.#setContainer#    设置新的Containner 并将新的Container关联到每个Connector

2.#AddConnector# 设置关联关系(包括Container和Service)然后将新的Connector加入到 Connector数组中

Server:

Server的任务是提供一个接口让其他程序能够访问到这个Service集合,同时维护它包含的所有Service的生命周期。标准实现类是StandardServer

重要的方法:

1.#addService# 与#AddConnector#相似  将新的Service加入到 Service数组中

Lifecycle:

TomCat中组件的生命周期是通过Lifecycle接口来控制的,组件只要继承这一接口并实现其中的方法就可以统一被拥有它的组件控制了。

这样一层一层地直到一个最高级的组件就可以控制TomCat中所有的组件的生命周期了,最高组件就是Server。而控制Server的是Startup,也就是启动和关闭Tomcat。

组件的声明周期由包含它的父组件控制,所以它的Start方法自然就是调用它下面的组件的Start方法,Stop方法也是一样。

以Server的start中的一段代码为例:

 synchronized(services){
for(int i = 0 ;i<services.length;i++){
if(services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();
}
}

简单地循环启动所有的Service组件,但是所有的Service必须要实现Lifecycle接口。

stop方法与之类似,不再赘述。

Connector组件

主要任务:负责接收浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据。然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给这个请求的线程,处理这个请求的线程就是Container组件的工作了。

简而言之,Connector最重要的功能就是接收连接请求,然后分配线程让Container来处理这个请求。

code略。

Servlet容器Container

Container容器的设计用的是典型的责任链设计模式,它由4个子容器组件构成,分别是Engine Host Context Wrapper 这四个组件是父子关系

通常一个Servlet class对应一个Wrapper,而多个Wrapper对应一个Context。

Context定义在父容器Host中,Host不是必需的,但是要运行war程序,就必须要用Host,因为在war中必有web.xml文件,这个文件的解析就需要Host。

如果有多个Host就要定义一个top容器Engine,一个Engine就代表了一个完整的Servlet引擎。

Engine容器:之定义了一些基本的关联关系,标准实现类是StandardEngine,没有父容器,添加的子容器只能是Host类型的。

Host容器:一个Host在Engine中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分他们。StandardHost除了继承了所有容器都继承的ContainerBase外,StandardHost还实现了Deployer接口,这个接口中的方法可以安装、展开、启动和结束每个Web应用。

Context容器:代表Servlet的Context,具备了Servlet运行的基本环境,理论上只要有Context就能运行Servlet了,简单的Tomcat可以没有Engine和Host。Context最重要的功能就是管理它内部的Servlet实例,Servlet实例在Context中是以Wrapper出现的。

Context的配置文件中有一个reloadable属性,当这个属性设置为true时,war被修改后Tomcat会自动重新加载这个应用。  //热部署

如何实现的热部署?

ContainerBase类中定义了一个内部类ContainerBackgroundProcessor,这个类运行在一个后台线程中,周期地执行run方法,这个run会周期地调用所有容器的backgroundProcess方法,而这个方法中部分代码如下:

if(reloadble && (getLoader().modified())){
....
reload(); //先调用stop方法再调用start方法 简单粗暴完成Context重新加载
....
}

Wrapper容器

重要的方法:

#loadServlet#   在这个方法中装载了Servlet后就会调用Servlet的init方法,同时会传一个StandardWrapperFacade对象(实现了ServletConfig接口)给Servlet。

当Servlet初始化完成后,就等着StandardWrapperValve调用它的Service方法了,调用Service方法之前要调用Servlet所有的Filter。

TomCat系统架构的更多相关文章

  1. Tomcat 系统架构与设计模式

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...

  2. tomcat 系统架构与设计模式 第二部分 设计模式 转

    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些 ...

  3. tomcat 系统架构与设计模式 第一部分 系统架构工作原理 转

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些开源 ...

  4. Tomcat系统架构分析

    Tomcat系统架构分析 关于这边blog呢,实际开发中并不会用到,但是我觉得还是很有必要认真的写一下.毕竟我们每天在本地撸码的时候使用的就是tomcat来做web服务器.一个常识就是说我们本地在to ...

  5. Tomcat 系统架构与设计模式之二

    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 来自:http://www.ibm.com/developerworks/cn/java/j-lo-tomcat2/ 这个分为两个部分的 ...

  6. Tomcat 系统架构与设计模式之一

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 来自:http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html 这 ...

  7. 粗浅看 Tomcat系统架构分析

    原文出处: 吴士龙 http://www.importnew.com/21112.html Tomcat的结构很复杂,但是Tomcat也非常的模块化,找到了Tomcat最核心的模块,就抓住了Tomca ...

  8. Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析(转载)

    简介: 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tomcat 的工作原理,第 2 部分将分析 Tomcat 中 ...

  9. Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

  10. Tomcat 系统架构与设计模式,第 1 部分: 工作原理

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

随机推荐

  1. python基础学习(十三)

    re模块包含对 正则表达式.本章会对re模块主要特征和正则表达式进行介绍. 什么是正则表达式 正则表达式是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.换包话说,正则表达式 ...

  2. 学习js的点点滴滴记录

    从安装完node.js后(里面自带了npm), 每个模块下都有个 package.json文件,在这个目录下打开cmd后 输入npm install 就是按照package.json里面的内容进行安装 ...

  3. POI设置excel添加列下拉框

    POI在生成excel模板时需要为列添加下拉框,我写了两个方法. @ 方法一:适用任何情况,不受下拉框值数量限制.但是需要通过引用其它列值. 思路大概如下: 1.创建一个隐藏的sheet页,用于存放下 ...

  4. javasript校验字符串【正则和其他函数】

    /**javasript校验输入框值只能为数字中文英文和下划线**/function isRegex(s){ var reg=/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/; if (! ...

  5. github如何添加ssh

    1.运行git Bash 输入如下命令: $ cd ~/.ssh $ ls 输入这2个命令 ,我们可以看到 id_rsa.pub 或 id_dsa.pub 这2个文件已经存在了,id_rsa 是私钥, ...

  6. zTree勾选状态的禁用节点不在选中节点里

    问题描述: 由于业务需求,需要将一部分节点设置为选中并且是禁用的状态.设置这部分节点的chkDisabled和checked属性值都为true.在zTree树上这部分节点是选中且禁用的状态,但是在保存 ...

  7. [js高手之路]深入浅出webpack教程系列8-(postcss-loader,autoprefixer,html-loader,less-loader,ejs-loader)用法

    我们接着上文,那么在上篇文章的最后,写到了css-loader的用法,如果你用心发现,就能看到我在style.css样式文件中写了一个这样的样式: div { transition: all ease ...

  8. ios和android的发展前景比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt164 一直都有很多人在讨论未来的IOS和android市场哪个前景更好,现在 ...

  9. java程序启动参数-D含义详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt407 java程序启动参数 -D是用来做什么的呢?去查询了一下官方解释: S ...

  10. Java学习记录 : 画板的实现

    接触java不满一个月,看厚厚的java入门简直要醉,故利用实例来巩固所学知识. 画板的实现其实从原理来说超级简单,可能一会儿就完成了. 但作为一名强迫症患者,要实现和win下面的画板一样的功能还是需 ...