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. php 微信公众号+微商城开发 基于Thinkphp3.2框架开发

    说明:本教程是自己自学+自己的理解+扩展(包括学习过程中遇到的一些问题) 参考教程:麦子学院--李忠益--http://www.maiziedu.com/u/70409/ 微盟: http://www ...

  2. 2017面向对象程序设计(Java)第二周学习总结

    2017面向对象程序设计(Java)第二周学习总结 直系学妹学弟们好!额...不要问我为什么把学妹放前面,我也不知道!我只是你们和蔼可亲的学长一枚而已.也不要问为什么是第二周学习总结而不是第一周,因为 ...

  3. 产品经理和Scrum Master都必须是领域专家吗?

    注明:原文来自 Mike Cohn的邮件推送,我已将原文贴在最后供参考,翻译的目的是为了锻炼自己的能力和理解水平,如有版权侵犯,请告之. Scrum Master 和 产品经理应该是领域专家吗?让我们 ...

  4. poj2828 Buy ticket

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  5. 数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程

    这篇文章是我之前写的博文 数据库方面的面试技巧,如何从建表方面展示自己能力 和 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程是一个系列的,通过面试官的视角和大家分 ...

  6. asp.net core策略授权

    在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...

  7. windows平台下node,npm,gulp配置

    参考文献:http://blog.csdn.net/yuanyuan214365/article/details/53749583 1.安装nodejs:nodejs nodejs安装路径随意 nod ...

  8. django模板(过滤器)

    -------------------django内建的过滤器-------------------1.add 使用形式为:{{ value | add: "2"}} 意义:将va ...

  9. c# typeof 与 GetType 作用与区别

    官方解释: Used to obtain the "System.Type" object for a type. A 'typeof' expression takes the ...

  10. Stylus-NodeJS下构建更富表现力/动态/健壮的CSS

    --------------------------本文来自张鑫旭大神博客------------------------------ 一.为什么我会讲Stylus,而不是SASS和LESS? SAS ...