Tomcat架构解析(一)-----Tomcat总体架构
Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助。
一、Server
1、最简单的服务器结构
最简单的服务器结构如图所示:

Server向客户端提供服务,并且服务器可以start或stop。
缺点:如果需要该服务器支持多种网络协议,就很难扩展,因此改进如下:
2、Connector和Container

将容器拆分成Connector以及Container,Connector用于和客户端连接,可以扩展支持多种协议,建立连接之后将socket交给Container处理。
缺点:一个Server存在多个Connector和Container,因此Connector和Container之间就需要建立比较繁琐的映射关系,改进如下:
3、加入Service

一个Server包括多个Service,一个Service可以包含多个Connector和一个Container,这样Connector在获得客户端的socket之后,交给对应的Service,由Service来找到对应的Container,进而处理客户端的相关请求。
缺点:应用服务器是一个运行环境,可能会有很多项目部署在Tomcat中,因此改进如下:
4、引入Context

将Container换成Engine,Context则表示应用本身,同时Engine和Context都包含start、stop方法,代表各个容器启动、关闭的行为,将各个容器加载资源、释放资源的动作解耦。
缺点:通常在一个主机下,提供多个域名的服务,因此引入Host,如下:
5、引入Host

缺点:一个Context中可以包含多个servlet实例,称为Wrapper,改进如下:
6、Wrapper

Engine、Host、Context、Wrapper是一类组件,这类组件的作用就是处理接收客户端的请求并且返回响应数据,并且有可能请求到Engine容器,Engine容器委托给子容器Host处理,修改如下:

使用Container代表容器,Engine、Host、Context、Wrapper都是Container的子容器,Container可以维护子容器。backgroundProcess()方法针对后台处理,并且其基础抽象类(ContainerBase)确保在启动组件的同时,异步启动后台处理。
Tomcat的总体架构大致如此。
二、Lifecycle生命周期
所有的容器中都存在start()、stop()等方法,因此抽象出Lifecycle接口,该接口中定义了相关的生命周期的方法。主要方法如下:



Lifecycle状态图:

三、Pipeline和Valve
对于应用服务器来说,增强各组件的扩展性以及灵活性是非常重要的,Tomcat采用职责链模式来实现每个Container组件处理请求的功能。
Pipeline代表职责链,后者表示阀门,具体的处理过程,如图所示:

说的简单点,就是每条线路上包含哪些操作,操作按照顺序一个个执行。Tomcat通过这种方式来决定每个容器的执行过程。之前的Tomcat架构图加上职责链如下所示:

简单的来说,Tomcat监听客户端的请求,获得请求后交个各个组件去处理,返回响应数据到客户端,并且Tomcat能支持HTTP、AJP等协议。并且在扩展性、可用性上有着非常优秀的设计。
四、tomcat工作原理
我们启动Tomcat时双击的startup.bat文件的主要作用是找到catalina.bat,并且把参数传递给它,而catalina.bat中有这样一段话:

Bootstrap.class是整个Tomcat 的入口,我们在Tomcat源码里找到这个类,其中就有我们经常使用的main方法:

这个类有两个作用 :1.初始化一个守护进程变量、加载类和相应参数。2.解析命令,并执行。
另外tomcat中有一个非常重要的xml,server.xml,来看下server.xml对应的真实的tomcat架构是啥样的。

Tomcat架构解析(一)-----Tomcat总体架构的更多相关文章
- Tomcat 第三篇:总体架构设计
Tomcat 总体架构设计 在开始这篇文章的时候,忽然发现上一篇内容的题目不是很合适,不应该叫启动流程,更确切的应该是叫启动脚本. 在最开始,先介绍下 Tomcat 的总体设计,先有一个大概的印象,对 ...
- Tomcat架构解析(五)-----Tomcat的类加载机制
类加载器就是根据类的全限定名(例如com.ty.xxx.xxx)来获取此类的二进制字节流的代码模块,从而程序可以自己去获取到相关的类. 一.java中的类加载器 1.类加载器类别 java中的类加 ...
- tomcat原理解析(二):整体架构
一 整体结构 前面tomcat实现原理(一)里面描述了整个tomcat接受一个http请求的简单处理,这里面我们讲下整个tomcat的架构,以便对整体结构有宏观的了解.tomat里面由很多个容器结合在 ...
- Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程
Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理.需要解决的问题有监听.协议以及处理器映射等等. 一.Connector设计 Connector要实现的 ...
- tomcat总体架构
Tomcat 总体结构图 从上图中可以看出Tomcat的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍.Connector 组件是可以被替换,这样可以提供给 ...
- 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构
1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...
- Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建
Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建 Nginx 是一个高性能的 HTTP反向代理服务器 Keepalived 是一个基于VRRP协议来实现的LVS服务高可 ...
- 搭建Keepalived + Nginx + Tomcat的高可用负载均衡架构
1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...
- Tomcat系列(一)- 整体架构
整体架构 我们想要了解一个框架,首先要了解它是干什么的,Tomcat我们都知道,是用于处理连接过来的Socket请求的.那么Tomcat就会有两个功能: 对外处理连接,将收到的字节流转化为自己想要的R ...
随机推荐
- Codeforces Beta Round #35 (Div. 2)
Codeforces Beta Round #35 (Div. 2) http://codeforces.com/contest/35 A 这场的输入输出是到文件中的,不是标准的输入输出...没注意看 ...
- Kylin介绍,功能特点【转】
Apache Kylin是一个开源的分布式分析引擎.完全由eBay Inc.中国团队开发 并贡献至开源社区.提供Hadoop之上的SQL查询接口及多维分析(MOLAP)能力以 支持大规模数据能在亚秒内 ...
- <context:annotation-config/>,<mvc:annotation-driven/>和<context:component-scan>之间的关系
首先看一下三个注解各自定义: ① <context:annotation-config/> 1.如果你想使用@Autowired注解,那么就必须事先在 spring 容器中声明 Autow ...
- 更改AVD默认路径
默认情况下,安卓模拟器镜像文件会放到%userprofile%\.android下,例如当前Win7登录用户为administrator 则%userprofile%为 c:\users\admini ...
- svn-经常遇到问题解答办法积累(一)
1.对于一个SVN使用新手,第一步,肯定是如何获取代码到本地指定的目录. 步骤: (1)新建一个存放svn中某一个代码库的目录,加入该目录命名为:Proj1SVN (2)右键鼠标,选择SVN Chec ...
- 10.23JS日记
1.逻辑运算 || && ! ||:遇到第一个为true的值就中止并返回 &&:遇到第一个为false的值就中止并返回,如果没有false值,就返回最后一个不是fa ...
- 基于kafka-net实现的可以长链接的消息生产者
今天有点时间,我就来说两句.最近接触的Kafka相关的东西要多一些,其实以前也接触过,但是在项目使用中的经验不是很多.最近公司的项目里面使用了Kafka消息中间件,由于以前的人员编写的客户端的类不是很 ...
- 14.Mysql事务控制和锁定
14.事务控制和锁定存储引擎和锁: MyISAM和MEMORY存储引擎的表支持表级锁: BDB存储引擎的表支持页级锁: InnoDB存储引擎的表支持行级锁.默认情况下,表锁和行锁都是根据执行的语句自动 ...
- 【Android优化篇】提升Activity加载速度的方法
文章转自:http://www.jianshu.com/p/2007ca0290d3 作者: CoderFan 前言 这个也是我面试遇到的问题,当时只回答了一种情况,异步加载数据,没想到别的方式,回来 ...
- 用MySQL的朋友们请不要使用"utf8",请使用"utf8mb4"
转自: (译)用MySQL的朋友们请不要使用"utf8",请使用"utf8mb4" 用MySQL的朋友们请不要使用"utf8",请使用 ...