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 ...
随机推荐
- React Ntive 学习手记
React使今年来比较热门的前端库,之所以说是库呢,因为React.js是应用于MVC中的V层, 它并不是一个完整的MVC框架,所以,我也不知称之为框架了. 不过这并不影响React的火热. 混合应用 ...
- #知识#室内设计原理ing
室内设计原理 第一章 室内设计的含义和基本观点 人的一生,绝大部分时间是在室内度过的,因此,人们设计创造的室内环境,必然会直接关系到室内生活.生产活动的质量,关系到人们的安全.健康.效率.舒适等等.室 ...
- 可变长度的Fibonacci数列
原题目: Write a recursive program that extends the range of the Fibonacci sequence. The Fibonacci sequ ...
- Thinkphp内置截取字符串函数
Thinkphp内置了一个可以媲美smarty的模板引擎,给我们带来了很大的方便.调用函数也一样,可以和smarty一样调用自己需要的函数,而官方也内置了一些常用的函数供大家调用. 比如今天我们说的截 ...
- IOS XIB Cell自适应高度实现
1.代码实现Cell高度自适应的方法 通过代码来实现,需要计算每个控件的高度,之后获取一个cell的 总高度,比较常见的是通过lable的文本计算需要的高度. CGSize labelsize = [ ...
- 【Java】深深跪了,OJ题目Java与C运行效率对比(附带清华北大OJ内存计算的对比)
看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. -------------------------------------- 这是切割线 ----------- ...
- Web项目的发布新手教程
ASP.NET服务器发布新手教程 ——本文仅赠予第一次做Web项目,需要发布的新手们,转载的请注明出处. 首先我们说一下我们的需要的一个环境.我使用的是Visual Studio 2010,版本.NE ...
- Memcached & Redis使用
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- Runtime 交换方法
创建UIImage分类UIImage+Image.h #import<UIKit/UIKit.h> @interfaceUIImage (Image) + (__kindof UIImag ...
- 快速学习C语言二: 编译自动化, 静态分析, 单元测试,coredump调试,性能剖析
上次的Hello world算是入门了,现在学习一些相关工具的使用 编译自动化 写好程序,首先要编译,就用gcc就好了,基本用法如下 gcc helloworld.c -o helloworld.o ...