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. Web学习-jsp实现servlet过程赏析

    Jsp在某种程度上就是一种servelt. 来看看tomcat容器如何将jsp页面翻译成一个"servlet". 一. F:\apache-tomcat-6.0.51\work\C ...

  2. HTTP协议初级入门

    Http = HyperText Transfer Protocol即超文本传输协议 HTTPS = Hyper Text Transfer Protocol over Secure Socket L ...

  3. 读取xml文件中节点

    /// <summary> /// /// </summary> /// <param name="xmlpath">节点路径</para ...

  4. 【DDD】领域驱动设计实践 —— 架构风格及架构实例

    概述 DDD为复杂软件的设计提供了指导思想,其将易发生变化的业务核心域放置在限定上下文中,在确保核心域一致性和内聚性的基础上,DDD可以被多种语言和多种技术框架实现,具体的框架实现需要根据实际的业务场 ...

  5. java对文件加锁

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt208 在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文 ...

  6. Javascript学习日志(三):闭包

    说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式 ...

  7. C# yield return用法

    本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ...

  8. 团队作业8——第二次项目冲刺(Beta阶段)Day2--5.19

    1.展开站立式会议: 会议内容:①汇报一天大家任务的完成成果. ②新成员对学到的知识进行交流,并向老成员提问. ③根据大家的进度制定新一轮的任务计划. 2.每个人的工作分配 队员 今日任务 明日任务 ...

  9. 团队作业4——第一次项目冲刺(Alpha版本) 4.24

    团队作业4--第一次项目冲刺(Alpha版本) Day four: 会议照片 每日站立会议: 项目进展 今天是项目的Alpha敏捷冲刺的第三天,先大概整理下昨天已完成的任务以及今天计划完成的任务.今天 ...

  10. 201521123086《java程序设计》第四周

    本章学习总结 尝试使用思维导图总结有关继承的知识点 1.2 使用常规方法总结其他上课内容. 为了不必要写重复的代码,可以运用继承,用关键字extends来定义一个类,被继承的类叫做父类,继承的类叫做子 ...