Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat架构图
我们先来看一张比较经典的Tomcat架构图:

从这张图中,我们可以看出Tomcat中含有Server、Service、Connector、Container等组件,接下来我们一起去大致的看看这些组件的作用和他们之间的相互联系。在这之前,我们先补充一个知识点,也就是Tomcat它实现的功能点是什么呢?通过查找一些资料,这里参考下极客时间《深入拆解Tomcat_Jetty》中的总结,即Tomcat 要实现 2 个核心功能:
- 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化;
- 加载和管理 Servlet,以及具体处理 Request 请求。
对应到架构图中,Tomcat 设计了两个核心组件:连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,也就是处理Socket连接,容器负责内部处理。
各组件介绍
在介绍各组件之前,我们先关注一下下面这张关系图:

从图中可以看出,最顶层为Server(图中未标明),也就是一个Tomcat实例。在一个Server下面可以有很多个Service服务,而每个Service服务又分为连接器和容器,也就是上面架构图中Connector和Container,其中连接器可以有多个,而容器只有一个,连接器Connector和容器Container之间的交互是通过ServletRequest和ServletResponse通信的。
Tomcat 内可能有多个 Service,这种设计是出于灵活性的考虑。通过在 Tomcat 中配置多个 Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。
其实,我们可以关注以下Tomcat中conf/web.xml的配置:

下面,我们来着重看一下连接器connector和容器container的内容
连接器Connector
Connector对 Servlet 容器屏蔽了协议类型及 I/O 模型等的区别,无论是 HTTP 还是 AJP,在容器中获取到的都是一个标准的 ServletRequest 对象。先来看一下Connector的设计结构图:

引用《深入拆解Tomcat_Jetty》中关于Connector的功能总结,主要有如下功能:
- 监听网络端口。
- 接受网络连接请求。
- 读取请求网络字节流。
- 根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的 Tomcat Request 对象。
- 将 Tomcat Request 对象转成标准的 ServletRequest。
- 调用 Servlet 容器,得到 ServletResponse。
- 将 ServletResponse 转成 Tomcat Response 对象。
- 将 Tomcat Response 转成网络字节流。
- 将响应字节流写回给浏览器。
从上面的结构图中可以看出,在Connector中使用ProtocolHandler来处理请求,其主要包含3个组件,分别为Endpoint、Processor、Adapter等。我们来看下ProtocolHandler的接口及其子类的类图:

关于连接器Connector的具体内容将在后期单独做详细介绍。
容器Container
Tomcat 设计了 4 种容器,分别是 Engine、Host、Context 和 Wrapper,其属于父子关系。具体可以参考上文提及的Tomcat中conf/web.xml。其具体的关系可以参考下图(来源:百度):

这四种容器的应用范围为:
- Engine:整个Catalina Servlet引擎;
- Host:包含一个或多个Context容器的虚拟主机;
- Context:表示一个Web应用程序,可以包含多个Wrapper;
- Wrapper:表示一个独立的Servlet;
关于容器Container的具体内容将在后期单独做详细介绍。
本文主要介绍了Tomcat 的大体架构,也大致介绍了Connector和Container的结构,后面将以源码为基础,详细的介绍其中的组件内容及相关的技术实现。
参考资料
- 《深入拆解Tomcat_Jetty》 极客时间
微信公众号: 源码湾
欢迎关注本人微信公众号: 源码湾。 本公众号将不定期进行相关源码及相关开发技术的分享,共同成长,共同进步~

Blog:
- 简书: https://www.jianshu.com/u/91378a397ffe
- csdn: https://blog.csdn.net/ZhiyouWu
- 开源中国: https://my.oschina.net/u/3204088
- 掘金: https://juejin.im/user/5b5979efe51d451949094265
- 博客园: https://www.cnblogs.com/zhiyouwu/
- 微信公众号: 源码湾
- 微信: WZY1782357529 (欢迎沟通交流)
Tomcat源码分析二:先看看Tomcat的整体架构的更多相关文章
- Tomcat源码分析一:编译Tomcat源码
Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...
- Tomcat源码分析 (五)----- Tomcat 类加载器
在研究tomcat 类加载之前,我们复习一下或者说巩固一下java 默认的类加载器.楼主以前对类加载也是懵懵懂懂,借此机会,也好好复习一下. 楼主翻开了神书<深入理解Java虚拟机>第二版 ...
- Tomcat源码分析 (七)----- Tomcat 启动过程(二)
在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析.实例化各大组件.初始化组件等逻 ...
- Tomcat源码分析 (六)----- Tomcat 启动过程(一)
说到Tomcat的启动,我们都知道,我们每次需要运行tomcat/bin/startup.sh这个脚本,而这个脚本的内容到底是什么呢?我们来看看. 启动脚本 startup.sh 脚本 #!/bin/ ...
- Tomcat源码(二):tomcat启动之前的初始化
当tomcat启动的时候 首先会加载 org.apache.ctalina.startup.BootStrap类. 使用eclipse或idea启动tomcat其实就是在启动这个类的main方法 根据 ...
- tomcat 源码分析
Tomcat源码分析——Session管理分析(下) Tomcat源码分析——Session管理分析(上) Tomcat源码分析——请求原理分析(下) Tomcat源码分析——请 ...
- Tomcat 源码分析(转)
本文转自:http://blog.csdn.net/haitao111313/article/category/1179996 Tomcat源码分析(一)--服务启动 1. Tomcat主要有两个组件 ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...
随机推荐
- CSS3 01. CSS3现状、属性选择器、伪类选择器、结构伪类、伪元素选择器、颜色、文本阴影shadow、盒子模型、私有化前缀
CSS 3 现状 兼容性差,需添加私有前缀/移动端优于PC端/不断改进中/渐进增强原则/考虑用户群体/遵照产品的方案 : CSS3手册 需要阅读其--阅读及使用指引 []表示全部的可选项 || 或者 ...
- 【Redis】主从复制
一.概述 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从 ...
- 【Offer】[54] 【二叉搜索树的第k小节点】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一棵二叉搜索树,请找出其中第k小的节点.例如,在下图的二叉搜索树里,按节点数值大小顺序,第三小节点的值是4.  牛客网刷题地址 思 ...
- C#客户端程序Visual Stadio远程调试
一,需求来源 在开发过程中,可能会要使用Win7 ,Win8 ,Win10等不同版本的系统去做兼容性调试,也有时候会去针对特别的显卡,无线网卡等等硬件设备的机器做优化,有一种较优的方案,那就是使用Vi ...
- windows 服务 安装、卸载
1.新建项目 选中windows服务 2.添加安装程序 3.修改安装代码 ServiceProcessInstaller processInstall; ServiceInstaller servic ...
- [大数据学习研究]2.利用VirtualBox模拟Linux集群
1. 在主机Macbook上设置HOST 前文书已经把虚拟机的静态IP地址设置好,以后可以通过ip地址登录了.不过为了方便,还是设置一下,首先在Mac下修改hosts文件,这样在ssh时就不用输入ip ...
- 3.httphandler和httpmodule各种的作用以及工作原理?
首先应该知道的是ASP.NET 请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET 把http请求依次传递给管道中各个HttpModul ...
- Python集训营45天—Day02
目录 变量和运算符 1.1 初步介绍 1.2 使用案例 1.3 知识点梳理 1.4 练习 序言:这一章我们将学习变量以及常见的类型,我们将以案例和代码相结合的方式进行梳理,但是其中所有的案例和知识点 ...
- ACM团队周赛题解(3)
940和822两套div.2 老规矩 #define MAXN 1000000+5#define MOD 1000000007#define PI (acos(-1.0))#define EPS 1e ...
- 多线程——Runnable接口
以实现Runable接口的方式创建线程比继承Thread类有很大的优越性,因为类不能多重继承,即一个类只能继承一个类,那么如果该类已经继承了一个类,就不能实现多线程了,但是可以通过实现Runable接 ...