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 ...
随机推荐
- IIS出现问题时修改配置文件的几项说明
近期系统在线运行经常出现object moved错误 通过查询资料,做了几项web.config文件的调整 1,调整应用程序池使用集成模式 <system.webServer> ...
- JAVA/Android Map与String的转换方法
在Android开发中 Map与String的转换在,在一些需求中经常用到,使用net.sf.json.JSONObject.fromObject可以方便的将string转为Map.但需要导入jar包 ...
- 解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题
Source目录 |-- stdafx.h |--Util目录 |--Util.h |--Util.cpp 现在的发现Util.cpp各种变量的定义全是红色波浪线,找不到定义,但是却能够编译过 问题就 ...
- 更改Xampp-sql的默认密码-配置appche运行环境
用php编写的web应用程序,需运行在php的web容器中,其中apache server是一个针对php web容器,它是apache下的开源项目.通常要运行一个web程序,我们还需要安装数据库软件 ...
- arduino 入手
新买了个ardhuino 入门套件 1. Win7 Driver issue: Need to install the below drivers, because my windows is ins ...
- 在mac下svn冲突或其它什么原因无法更新svn副本或是必须要删除svn信息时,如何清除svn信息
find . -type d -name ".svn"|xargs rm -rf 出处: http://blog.csdn.net/springsky_/article/detai ...
- maven里的modelVersion
modelVersion 描述这个POM文件是遵从哪个版本的项目描述符
- 跟visual studio 集成的git插件
目前有三个,git extension,微软的 visual studio tools for git extension,还有git source control provider 经测试,最好用的 ...
- Linux常用目录
- Web Essentials之样式表StyleSheets
返回Web Essentials功能目录 本篇目录 智能感知 视觉提示 验证 Web标准 转换器 Web Essentials中大多数的CSS功能也适用于LESS. 智能感知 生成供应商特定的属性 如 ...