Tomcat总体架构,启动流程与处理请求流程
参考书籍《Tomcat架构解析》
一丶Tomcat总体架构
本文沿袭《Tomcat架构解析》中启发式的方式来总结Tomcat总体架构
1 Server

Server接受客户端发送的请求数据并进行解析,完成相关的业务处理,然后将处理结果作为响应返回给请求计算机。
从上面这段话来看,如果我们将上述功能全部让Server去做实现,那么让请求监听和请求处理耦合度很高,不利于适配。
2.Connector 和 Container
如何解决请求监听和请求处理耦合度很高的问题?加一层就好。
Connector
Connector负责开启socket并且监听客户端请求,返回响应数据。
Engine
Engine负责处理具体的请求
如是我们有下面这种设计

这种设计需要server维护Connector和Engine的关系,才可以将Connector的请求交给对应Engine
并且无法做到一个Tomcat服务器运行多个服务,比如订单服务,用户服务。将Connector和Engine都交给Server处理,无法实现服务间的隔离。
3.Service
如何实现服务间的隔离?加一层就好
Server表示Tomcat服务器,一个Tomcat服务器可以部署多个服务,比如订单服务,用户服务。这里的服务就是Service。

由Service负责当前自己服务中的维护Connector 和 Engine,Server负责管理多个服务
4.Context,Host,Wrapper
Context
应用服务器是用来部署并允许web应用的,是一个运行环境,而不是一个独立业务处理系统,因此在Engine容器需要支持管理web应用,这里便是使用Context来表示一个web应用
Host
Tomcat除了可以支持多个web应用之外,还需要可以支持多域名服务,比如一个主机可以承担多个域名,比如newx.cuzz.com,game.cuzz,com。因此需要把每一个域名视为一个虚拟主机,在每一个虚拟主机下包含多个web应用。
Wrapper
在一个web应用中可以包含多个不同的servlet实例处理来自不同连接的请求,因此还需要一个组件的概念来表示tomcat中的servlet,这个组件就是Wrapper

5.Container
Container表示一类组件,它们负责接受来自客户端的请求,并返回响应数据,这个过程往往会委托其他组件去完成,但是本质上它们是一致的——都是接受请求,返回响应数据。
Container表示容器,可以添加并维护子容器,因此Engine,Host,Context,Wrapper均继承自Container

Container还提供了backgroundProcess方法,方便子类实现后台任务
6.Lifecycle
可以看到上图中组件都存在start,stop等生命周期方法,因此Tomcat抽象出Lifecycle接口,表示生命周期,定义了init,start,stop,destory等生命周期回调方法。并且还提供了LifecycleListener使用监听器模式来实现生命周期事件监听。

7.Pipeline和Valve
为了增强扩展性,tomcat定义了Pipeline(管道)和Valve(阀),Pipeline使用职责链的方式串联多个Valve——来自客户端的请求如同流水一样流淌在管道中,收到每一个阀的作用。

Pipeline中维护了基础的Valve,始终位于Pipeline末端,通过Pipeline#addValve添加的Valve违约基础的Valve之前。
在Tomcat中Engine,Host,Context,Wrapper都有对应的Valve实现,同时维护了一个Pipeline,从而让我们可以对请求的处理进行扩展。

8.Connector设计
一个Connector处理请求的流程大致如下

这些操作会被委托给Endpoint,ProtocolHandler,Processor
- Endpoint:tomcat中没有这个接口,只有AbstractEndpoint,它负责启动线程来监听服务器端口,并且在接受到数据后交给Processor处理
- Processor:Processor读取到客户端请求后按照请求地址映射到具体的容器进行处理,这个过程请求映射,Processor实现请求映射依赖于Mapper对象,在容器发生注册和注销的时候,MapperListener会监听到对应的事件,从而来变更Mapper中维护的请求映射信息。
- ProtocolHandler:协议处理器,针对不同的IO方式(NIO,BIO等)和不同的协议(Http,AJP)具备不同的实现,ProtocolHandler包含一个Endpoint来开启端口监听,并且包含一个Processor用于按照协议读取数据并将请求交给容器处理。

在次之外Tomcat 还有一个Adapter接口,上面说到Processor会依赖Mapper实现请求映射,但是其实Proccessor并没有直接持有一个Mapper,而是持有一个Adapter,由Adapter负责实现请求映射并交由Container处理请求。Adapter在Tomcat中只有一个实现CoyoteAdapter。
CoyoteAdapter在Processor和 Mapper以及Container中横插一脚,实现Connector和Mapper以及Container的解耦。

结合tomcat整体架构后的图

9.Executor
Tomcat定义了Executor接口,只有一个实现类StandardThreadExecutor,目的是为了实现tomcat组件间的线程池共享,并且这个线程池由Service进行管理,即同一个Server中的组件可以共享一个线程池。

10 Bootstrap与Catalina
Tomcat通过类Catalina提供了一个Shell程序,用于解析server.xml创建各个组件。同时,负责启动、停止应用服务器(启动tomcat顶层组件Server)
Tomcat提供了Bootstrap作为应用服务器启动入口,Bootstrap负责反射创建Catalina实例,根据执行参数调用Catalina相关方法完成针对应用服务器的操作(启动、停止)。
在Tomcat发布包中,Bootstrap位于$CATALINA_HOME/bin下,和Tomcat应用服务器完全松耦合(通过反射调用Catalina实例),它可以直接依赖JRE运行并为Tomcat应用服务器创建共享类加载器,用于构造Catalina实例及整个Tomcat服务器。


二丶Tomcat启动流程

可以看到Tocmat的启动流程非常标准化,这得益于这些组件都实现了Lifecyle接口。首先是调用init初始化组件,然后调用start方法启动组件,每次调用都伴随着生命周期事件的触发。
三丶Tomcat处理一个请求的流程
应用程序的请求处理,开始于监听服务器socket端口接受到数据,结束与服务器处理结果写入Socket输出流。
在此过程中,服务器需要将请求内容按照协议内容进行解析,封装为对象,然后根据请求映射规则定位到具体Servlet,这个Servlet中就是我们业务逻辑(SpringMVC中是DispatcherServlet将进一步将请求分发到Controller)Servlet处理结束后,响应对象将按照协议内容写如输出流。

Tomcat总体架构,启动流程与处理请求流程的更多相关文章
- Tomcat总体架构和启动流程
Tomcat大家都知道,这个没什么好描述的,我们先看Tomcat的总体架构 1.总体架构 架构一步一步增加组件,先来个最原始的 === Server:Tomcat的整体服务,负责接收和处理请求.其拥有 ...
- Tomcat架构解析(一)-----Tomcat总体架构
Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server 1.最简单的服务器结构 最简单的服务器结构如图所示: ...
- tomcat总体架构
Tomcat 总体结构图 从上图中可以看出Tomcat的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍.Connector 组件是可以被替换,这样可以提供给 ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- Tomcat 第三篇:总体架构设计
Tomcat 总体架构设计 在开始这篇文章的时候,忽然发现上一篇内容的题目不是很合适,不应该叫启动流程,更确切的应该是叫启动脚本. 在最开始,先介绍下 Tomcat 的总体设计,先有一个大概的印象,对 ...
- SpringMVC学习笔记一(请求流程和配置,启动项目)
springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ...
- Tomcat 系统架构与设计模式
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)
简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理
简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...
- tomcat 系统架构与设计模式 第一部分 系统架构工作原理 转
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些开源 ...
随机推荐
- C++初识指针之一
新手学习C/C++都跳不过去的地方,就是指针,用的话,确实好用,但是概念比较绕, 指针的通俗说法 1.简单的来说,就是说每一个变量,在电脑内都占一个地方,这个地方用一个16进掉的编号来进行标记,类似于 ...
- 配置tlpi_hdr.h 头文件《linux系统编程》(转载)
https://www.cnblogs.com/pluse/p/6296992.html#:~:text=tlpi_hdr.h%E6%96%87%E4%BB%B6%E5%88%99%E5%8C%85% ...
- Keil Jlink没法找到STM32H750
https://www.amobbs.com/thread-5713382-1-1.html MDK使用的是5.32,jlink使用的是9.2jlink驱动使用的是6.44b 删除工程下的JLinkS ...
- goujian
第二章的内容先对第一张来说更偏向于技术性,在团队合作中,如何保证自己所负责模块的质量的稳定,这就对自身的技术和一些良好的代码书写习惯有一定的要求.这里除了之前接触的代码的整齐(段落划分),变量值和文件 ...
- Linux系统下祼机安装mysql8.0和docker mysql 8.0 性能差异对比~
环境准备 准备两台服务器环境,配置相同,分别安装Centos7,mysql8.0,docker mysql 8.0 准备测试代码 public class Chat { public static l ...
- 声网Agora发布教育信息化解决方案 助力教育公平提效
4月23日-25日,由中国教育装备行业协会主办的第79届教育装备展在厦门国际会展中心举办.作为赋能教育信息化的实时互动PaaS服务商,声网Agora应邀参会.展会现场,声网展示了基于实时音视频互动能力 ...
- 利用selenium爬取前程无忧招聘数据
1.背景介绍 selenium通过驱动浏览器,模拟浏览器的操作,进而爬取数据.此外,还需要安装浏览器驱动,相关步骤自行解决. 2.导入库 import csv import random import ...
- Out Of Memory 案例
案例一:老年代内存泄漏 某晚八点收到报警邮件,一看是OOM: 打开 hickwall查看指标:JVM各项指标中 老年代在持续增长(从上次发布10月30号到11月10号的 12天 一直在增长,存在内 ...
- 抽象同步队列AQS原理和实践
AQS简述 AQS是一个FIFO的双向队列,队列元素类型为Node(也就是Thread).AQS有一个state属性,ReentrantLock可以用来便是当前线程获取锁的可重入次数:对于samaph ...
- 华为人工智能atlasA800-9000物理服务器离线安装及CANN安装和MindSpore安装和Tensorflow安装
目录 华为人工智能atlas A800-9000 物理服务器全程离线安装驱动以及CANN安装部署和MindSpore安装部署和Tensorflow安装部署 A800-9000 物理服务器安装驱动 使用 ...