Tomcat源码阅读(二)初始化
近来,我开始阅读tomcat的源码,感觉还挺清晰易懂;为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下;整个tomcat的组成如下图所示:
Tomcat在接收到用户请求时,将会通过以上组件的协作来给最终用户产生响应。首先是最外层的Server和Service来提供整个运行环境的基础设施,而Connector通过指定的协议和接口来监听用户的请求,在对请求进行必要的处理和解析后将请求的内容传递给对应的容器,经过容器一层层的处理后,生成最终的响应信息,返回给客户端。
Tomcat的容器通过实现一系列的接口,来统一处理一些生命周期相关的操作,而Engine、Host、Context等容器通过实现Container接口来完成处理请求时统一的模式,具体表现为该类容器内部均有一个Pipeline结构,实际的业务处理都是通过在Pipeline上添加Valve来实现,这样就充分保证整个架构的高度可扩展性。Tomcat核心组件的类图如下图所示:
接着,以tomcat的入口为起点,我将初始化的步骤描述在以下流程图中:
Tomcat在启动时的重点功能如下:
1、初始化类加载器:主要初始化CommonLoader、CatalinaLoader以及SharedLoader;
2、解析配置文件:使用Digester组件解析Tomcat的server.xml,初始化各个组件(包含各个web应用,解析对应的web.xml进行初始化);
3、初始化连接器:初始化声明的Connector,以指定的协议打开端口,等待请求。
各个类职责(翻译自tomcat6源码注释)
1、Bootstrap
Catalina的Boostrap加载器。此应用程序构建了一个类加载器用于加载的Catalina自身的类(在“catalina.home”中的“服务器”目录下的所有JAR文件),并开始定期执行的容器。这种迂回的方法的目的是保持Catalina自身的类(和它们所依赖的任何其他类,如XML解析器)的系统类路径中,所以无法看到应用级的类。
2、Catalina
Startup/Shutdown shell
3、StandarServer
Server接口的标准实现,当deploy和start时可用(但不是必须)
4、StandarService
Service接口的标准实现,关联的Container是Engine的实例,但不是必须
5、Container
Container是从client中执行接收请求,而且基于这些请求返回响应。一个Container能选择地支持一个处理请求的顺序在运行时配置,通过实现Pipeline接口。
5-1、Context
一个上下文是一个容器,它代表了一个servlet上下文,因此一个单独的Web应用程序中的Catalina servlet引擎。它是应用于几乎每一个部署的Catalina(即使连接到一个网络服务器(如Apache)的连接器使用Web服务器的设施,以确定在适当的包装处理此请求。它也提供了一个方便的机制,以使用拦截器,看到这个特定的web应用程序处理每一个请求。
附加到一个上下文的父容器通常是一个Host,但可能有一些其他的实施,或者,如果不是必要的,也可以省略。
连接上下文的子容器包装(即单独的servlet定义)实现。
5-2、Engine
引擎是一个容器,它代表整个Catalina servlet引擎。它是非常有用的方案在以下类型:
*您希望使用拦截器,看到整个engine的每一个请求处理
*您希望运行的Catalina在一个独立的HTTP连接器,但是还是要支持多个虚拟主机。
一般情况下,您将不能使用的引擎时,部署Catalina连接到一个网络服务器(如Apache),因为连接器将已使用的Web服务器的设备,以确定哪些上下文(或也许甚至它的包装)应该被利用来处理这个的要求。子容器连接到Engine的主机(虚拟主机)或Context(即个人单独的servlet上下文)的实现,取决于Engine的执行。
如果使用,Engine始终在Catalina层次结构的顶层容器。因此,实现的setParent()方法抛出IllegalArgumentException。
5-3、Wrapper
一个Wrapper是一个容器,它代表一个单独的servlet定义的Web应用程序的部署描述符。它提供了一个方便的机制来使用拦截器,每一个请求由这个定义的servlet。
实现Wrapper是负责管理servlet的生命周期,以及其基本的servlet类,包括调用init()和destroy()在适当的时候尊重了SingleThreadModel声明的servlet类本身的存在。
6、Connector
Coyote connector的实现
7、Adapter
表示一个coyote基于servlet容器中的入口点
8、ProtocolHandler
protocol实现的抽象,包括线程,处理器是单线程的,基于流的协议,将不适合JK协议,如JNI;这是coyoute connector实现的主接口;Adapter是coyote servlet container的主接口。
转自http://blog.csdn.net/xiejueheng/article/details/45799501
Tomcat源码阅读(二)初始化的更多相关文章
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- tomcat源码阅读之过滤器
一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...
- tomcat源码阅读之SingleThreadModel
一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...
- tomcat源码阅读之载入器(Loader)
一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...
- xxl-job源码阅读二(服务端)
1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...
- tomcat源码阅读
1 工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2 下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...
- Spring 源码阅读 二
程序入口: 接着上一篇博客中看完了在AnnotationConfigApplicationContext的构造函数中的register(annotatedClasses);将我们传递进来的主配置类添加 ...
- Tomcat源码(二):tomcat启动之前的初始化
当tomcat启动的时候 首先会加载 org.apache.ctalina.startup.BootStrap类. 使用eclipse或idea启动tomcat其实就是在启动这个类的main方法 根据 ...
- tomcat源码阅读之BackupManager
一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...
随机推荐
- js的执行机制
遇到一个问题,因为自己本身就是菜鸟的原因,弄懂了还是很高兴的. console.log(a) function a() { return "this is function" } ...
- Asp.Net异步编程-使用了异步,性能就提升了吗?
Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...
- GetRelevantAnimTimeRemainingFraction节点Bug
初始设置: 动画状态机: MoveStop->Idle的条件: 使用该节点的目的: 在动画蓝图的过渡条件中使用该节点,保证上一个状态的动作完成后进入下一个动作.需求是MoveStop动作完成后才 ...
- WPF 显示GIF动画
简单的通过GifBitmapDecoder解析GIF图片,获取gif帧数和每一帧数据,然后通过时间切换显示,效果如下: 代码如下: namespace GIfImageApplication { pu ...
- myeclipse使用maven插件进行maven install时报错check $m2_home environment variable and mvn script match
check $m2_home environment variable and mvn script match 分类: maven2015-09-01 18:06 842人阅读 评论(0) 收藏 举 ...
- XPath使用示例
1.查找空节点//*[not(text())] 表示内容为空的节点//*[count(*)=0] 表示没有子节点的节点"//*[count(*)=0 and n ...
- cas+shiro实现不时时的去请求cas进行身份验证
cas+shiro不进行时时去cas验证身份信息,需要用shiro在当前系统有一份完整的认证机构. 那么有一个问题,什么时候去cas校验信息,目前的配置方式: cas系统设置默认的浏览器session ...
- Java中HashMap等的实现要点浅析
@南柯梦博客中的系列文章对Jdk中常用容器类ArrayList.LinkedList.HashMap.HashSet等的实现原理以代码注释的方式给予了说明(详见http://www.cnblogs.c ...
- Dojo Data Store——统一数据访问接口
原文地址:http://www.infoq.com/cn/articles/wq-dojo-data-store 无论在传统的桌面应用还是在主流的互联网应用中,数据始终占据着软件应用中的核心地位.当下 ...
- 【设计模式之单例模式InJava】
1. 单例模式 1.1饿汉式(开发常用) class SingleFirst { /* 添加其他成员信息 */ private static SingleFirst s1 = new SingleFi ...