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. 关于aop的两种方式-基于注解和基于aspectj

    spring的aop确实好用,能够在不影响业务功能的情况下,实现一些低耦合的功能. 而aop又有两种常用的实现方式,一种是用aspectj表达式去匹配,实现全局的配置,表达式还可以使用与或非符号去连接 ...

  2. CSS布局技巧大全

    参考资料: http://www.imooc.com/article/2235 单列布局 水平居中 父元素text-align:center;子元素:inline-block; 优点:兼容性好: 不足 ...

  3. [REST] 1.REST的起源

    0. 世界上第一个网站 1990年12月20日,这一天对于现在的互联网来说意义非凡.欧洲核子研究组织(CREN)的科学家Tim Berners-Lee在一台NeXT电脑上启动了世界上的第一个网站(当然 ...

  4. MySQL整数类型说明 int(5) vs int(7)

    今天突然发现, mysql 中int(1)和tinyint(1)中的1只是指定显示长度,并不表示存储长度,只有字段指定zerofill时有用.位数限制基本没有意义. int(5) 这里的5表示的是 最 ...

  5. Spark Submit 脚本

    当我们需要命令行传递参数时候,将--class 写在前面,然后是jar 最后是参数 spark-submit --master yarn --num-executors 3 --executor-me ...

  6. 高阶自定义View --- 粒子变幻、隧道散列、组合文字

    高阶自定义View --- 粒子变幻.隧道散列.组合文字 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:h ...

  7. python 斐波那契数列 fibonacci

    在python中生成fibonacci数列的函数 def fibonacci(): list = [] while 1: if(len(list) < 2): list.append(1) el ...

  8. CRC与MD5的异同

    php中CRC32的用法: crc32 - 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式--: 这句话从英文翻译过来的,不正确,准确的说应该是这么理解 ...

  9. 转:【深入Java虚拟机】之六:Java语法糖

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...

  10. [转载] java中静态代码块的用法 static用法详解

    一.java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...