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 ...
随机推荐
- 【原创】(三)Linux paging_init解析
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- 工作中遇到的99%SQL优化,这里都能给你解决方案(二)
-- 示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL ...
- Day002_LInux基础_常用命令_001
1.创建用户useradd -m -g 加参数-m 会自动创建家目录 -g 指定group 加入什么群组 passwd 设置用户的密码 su 和su - 的区别 su - 切换用户switch use ...
- mybatis_plus插件——生成器
最近在学习mybatis框架,虽然已经简化了一些Dao代码,但是还想更上一层楼吗?不再被基本的pojo层,controller层,service层,dao层基本重复代码所困恼吗?这里,让我们来学习一下 ...
- SpringMVC 视图解析器 InternalResourceViewResolver
我们在使用SpringMVC的时候,想必都知道,为了安全性考虑,我们的JSP文件都会放在WEB-INF下, 但是我们在外部是不可以直接访问/WEB-INF/目录下的资源对吧, 只能通过内部服务器进行转 ...
- Python(Head First)学习笔记:三
3 文件与异常:调试.处理错误.迭代.改进.完善 处理错误:利用Python的异常处理机制来处理异常情况. 程序外部的数据:大多程序基本模型:首先输入数据,进行处理,然后存储.显示.打印或传输. ...
- 新书推荐《再也不踩坑的Kubernetes实战指南》
<再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...
- 并发之初章Java内存模型
>>>>>>博客地址<<<<<< >>>>>>首发博客<<<<< ...
- [币严BIZZAN区块链]数字货币交易所钱包对接之比特币(BTC)
在币严BIZZAN开发数字货币交易所的过程中,一共有两大难点,一个是高速撮合交易引擎,另一个是钱包对接,这两者是我们团队以前没有接触过的.这个系列的文章主要介绍数字货币交易所钱包对接实现技术.第一个要 ...
- jumper-server-第一次粗略配置
https://www.cnblogs.com/zsl-find/articles/11179450.html