Tomcat工作原理介绍

article/2025/9/14 0:57:10

Web应用程序都是靠Web服务器运行的,Tomcat是常用的Web服务器(兼具Servlet容器+HTTP服务器功能)之一,此篇博客将从工作原理上来认识Tomcat。Tomcat作为Web服务器需要处理两类核心任务:处理 Socket 连接,负责网络字节流与Request和Response对象的转化。加载和管理 Servlet,以及处理 Request 请求。为了处理这两类任务,Tomcat 设计了两个核心组件连接器Connector和容器Container来分别做这两件事情。连接器负责对外交流,容器负责内部处理。

连接器对Servlet 容器屏蔽了协议及 I/O 模型等的区别,无论是 HTTP 还是 AJP,在容器中获取到的都是一个标准的 ServletRequest 对象。连接器主要完成的任务如下所示:

监听网络端口。
接受网络连接请求。
读取请求网络字节流。
根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的 Tomcat Request 对象。
将 Tomcat Request 对象转成标准的 ServletRequest。
调用Servlet 容器,得到 ServletResponse。
将ServletResponse 转成 Tomcat Response 对象。
将Tomcat Response 转成网络字节流。
将响应字节流写回给浏览器。

容器部分,Tomcat设计了4种容器,分别是 Engine、Host、Context 和 Wrapper。这 4 种容器不是平行关系,而是父子关系。四种容器的关系如下图所示:

Context表示一个Web应用程序;Wrapper表示一个Servlet,一个Web应用程序中可能会有多个Servlet;Host代表的是一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可以部署多个Web应用程序;Engine 表示引擎,用来管理多个虚拟站点,一个 Service最多只能有一个Engine。查看tomcat下server.xml的配置,可以看到有关于service/engine/connector/Host等的配置。在server.xml中可以配置多个Connector,不同的Connector对应不用的协议连接,例如https默认在8080端口,https默认在8443接口。

在Tomcat目录的webapps下,可以创建多个目录放入多个应用的war包,这样一个Tomcat就可以部署多个web应用了。

当在浏览器中访问一个地址“http://localhost:8080/one/hello-servlet”,Tomcat是如何定位到Servlet的呢?首先,根据协议和端口号选定 Service 和 Engine。Tomcat 的每个连接器都监听不同的端口,比如 Tomcat 默认的 HTTP 连接器监听 8080 端口、默认的 AJP 连接器监听 8009 端口。上面例子中的 URL 访问的是 8080 端口,因此这个请求会被 HTTP 连接器接收,而一个连接器是属于一个 Service 组件的,这样 Service 组件就确定了。另外Service 组件里除了有多个连接器,还有一个容器组件,具体来说就是一个 Engine 容器,因此 Service 确定了也就意味着 Engine 也确定了。然后,根据域名选定 Host。Service 和 Engine 确定后,Mapper 组件通过 URL 中的域名去查找相应的 Host 容器,比如例子中的 URL 访问的域名是 localhost,因此 Mapper 会找到localhost对应的这个容器。之后,根据 URL 路径找到 Context 组件。Host 确定以后,Mapper 根据 URL 的路径来匹配相应的 Web 应用的路径,比如例子中访问的是 one/hello-servlet,因此找到了对应的one这个Context 容器。最后,根据 URL 路径找到 Wrapper(Servlet)。Context 确定后,Mapper 再根据 web.xml 中配置的 Servlet 映射路径来找到具体的 Wrapper 和 Servlet。

前面介绍了Tomcat中的连接器和容器,接着再来看看Tomcat服务启动过程,下载Tomcat解压后,进入bin目录,执行startup和shutdown脚本即可实现tomcat的启动和停止。Tomcat启动过程如下图所示:

1.Tomcat 本质上是一个 Java 程序,因此 startup.sh 脚本会启动一个JVM 来运行Tomcat 的启动类 Bootstrap。

2.Bootstrap 的主要任务是初始化Tomcat 的类加载器,并且创建Catalina。

3.Catalina是一个启动类,它解析server.xml、创建相应的组件,并调用Server的start方法。

4.Server组件的职责就是管理Service组件,它会负责调用Service的start方法。

5.Service组件的职责是管理连接器和顶层容器Engine,因此它会调用连接器和Engine的start方法

查看Tomcat包下面的startup.sh脚本,可以看到实际调用的是catalina.sh,该脚本会运行Bootstrap的jar包,如果有些环境变量需要设置,可以在setenv.sh文件下设置,如下图所示启动CAT(一个链路追踪工具)时,在setenv.sh中设置了环境变量,启动Tomcat的时候也可以看到添加的环境变量生效。

前面介绍的都是Tomcat作为独立的部分来部署web应用,实际Springboot已经内部集成了tomcat作为web服务器,启动一个springboot的应用,启动日志如下所示:可以看到启动过程中启动了内置的tomcat,这样当springboot程序启动完成后,可以在浏览器或者postman上调用封装的接口。

在Tomcat独立部署的模式下,我们通过startup脚本来启动Tomcat,Tomcat中的Bootstrap和Catalina会负责初始化类加载器,并解析server.xml和启动这些组件。在内嵌式的模式下,Bootstrap和Catalina的工作就由SpringBoot来做了,SpringBoot调用了Tomcat的API来启动这些组件。那SpringBoot是如何完成调用的呢?查看SpringApplication类,在构造方法中有设置webApplicationType的代码,查看代码,可以看到是根据一些条件判断是否内部启动web容器的逻辑。构造方法查看后,查看SpringApplication类中的run()方法,run阶段有refreshContext方法。

 

refresh方法用来新建或者刷新一个ApplicationContext,在refresh方法中会调用onRefresh 方法,AbstractApplicationContext 的子类可以重写这个方法 onRefresh 方法,来实现特定 Context 的刷新逻辑,因此ServletWebServerApplicationContext 就是通过重写 onRefresh 方法来创建内嵌式的 Web 容器,具体创建过程如下图部分关键代码所示:最终实现内置启动tomcat的效果

以上就是springboot集成tomcat的逻辑,在集成tomcat后,可以在application.properties中设置tomcat相关的参数,如下图所示,左图是在独立tomcat下的server.xml中配置相关参数,右图是在application.properties中设置相关参数。通过调节这些参数可以有效提升web应用的性能。

除了设置线程数这些参数外,还可以在application.properties文件下设置tomcat日志相关的参数。

Springboot默认内置的web服务器是Tomcat,如果要修改成其他Web服务器也可以,例如将Web服务器切换到Undertow。Undertow 是一个采用Java开发的灵活的高性能Web服务器,提供包括阻塞和基于NIO的非堵塞机制。Undertow是红帽公司的开源产品,是Wildfly默认的Web服务器。修改pom.xml文件即可完成切换。从依赖信息里移除Tomcat配置,添加新的web服务器依赖即可。

以上就是对Tomcat相关工作原理的学习。


http://chatgpt.dhexx.cn/article/9eUYJ5Fv.shtml

相关文章

tomcat原理解析(一):一个简单的实现

一 概述 前段时间去面试,被人问到了tomcat实现原理。由于平时没怎么关注容器的实现细节,这个问题基本没回答上来。所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP请求的流程。网上讲tomcat的帖子比较多,大多都…

Tomcat工作原理之运行机制

一、Tomcat运行原理分析1.Tomcat是运行在JVM中的一个进程。它定义为【中间件】,顾名思义,是一个在Java项目与JVM之间的中间容器。 2.Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),,意味着…

tomcat 工作原理

大致的架构是 jsptomcatmysql,记录tomcat学习一点笔记。 Tomcat是Servlet运行环境(容器),每个servlet执行init(),service(),destory() 以下是servlet的作用 Servlet的调用 Tomcat的工作模式3种:独立Servlet&#xff0c…

Tomcat的原理及架构

转自:https://zhuanlan.zhihu.com/p/35398064 俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂&#xf…

Tomcat基本原理

1.Tomcat核心: Http服务器Servlet容器 组件分工: 连接器Connector:处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。容器Container:加载和管理 Servlet,以及具体处理 Request 请求。 …

tomcat的工作原理

本文源自转载:你还记得 Tomcat 的工作原理么 一、Tomcat 整体架构 Tomcat 是一个免费的、开源的、轻量级的 Web 应用服务器。适合在并发量不是很高的中小企业项目中使用。 二、文件目录结构 以下是 Tomcat 8 主要目录结构 三、功能组件结构 Tomcat 的核心功能有…

Tomcat原理整理

目录接口 功能组件 Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,多个 Connector 和一个 Container 一起构成了基本的 web 服务 Service。每个 Serve…

Tomcat工作原理详细介绍

大部分企业的 Web 应用都运行在它上面,Tomcat 对于程序员来说算是老朋友了,那么今天带大家走近这位老朋友,看看它是如何处理 Web 请求,以及它内部的体系结构,这对帮助我们理解 Tomcat 的使用大有益处。 本文你将会学会…

Tomcat原理

Tomcat顶层架构 Tomcat的顶层结构图: 1、Tomcat中最顶层的容器是Server,代表着整个服务器,一个Server可以包含至少一个Service,用于具体提供服务。 2、Service主要包含两个部分:Connector和Container。 Tomcat 的心脏…

javascript 文本框限制输入1到10位数字正则表达式

<meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <!DOCTYPE html> <html> <head><title>DOM 教程</title><style></style><!--不需要再次引用jquery--><script type"te…

js数字正则

js正则表达式 1.了解什么是正则表达式&#xff1f; 正则表达式&#xff08;Regular Expression&#xff09;又称规则表达式&#xff0c;简单来说它就是一个概念&#xff0c;用事先声明好的字符和字符的组合&#xff0c;来组成一个“规则字符串”&#xff0c;用来检测我们书写…

卷积神经网络降维方法,深度神经网络降维方法

1、卷积神经网络中用1*1 卷积有什么作用或者好处 1*1卷积的主要作用有以下几点&#xff1a; 1、降维&#xff08; dimension reductionality &#xff09;。比如&#xff0c;一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积&#xff0c;那么结果的大小为500*5…

常用降维方法

降维方法分为线性核非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方法。 线性降维方法&#xff1a;PCA ICA LDA LFA LPP(LE的线性表示) 基于核函数的非线性降维方法&#xff1a;KPCA KICA KDA 基于特征值的非线性降维方法&#xff08;流型学习&#x…

机器学习四大数据降维方法详解

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

机器学习 | 降维问题

目录 一、主成分分析 二、奇异值分解 2.1 奇异值分解原理 2.2 奇异值分解实践 三、特征值与特征向量 一、主成分分析 主成分有如下特征&#xff1a; 每个主成分是原变量的线性组合&#xff1b;各个主成分之间互不相关&#xff1b;主成分按照方差贡献率从大到小依次排列&…

数据降维方法总结

Introduce 经过这几天面试后&#xff0c;我发现数据降维这一块在工业界用的很多或者说必不可少&#xff0c;因此&#xff0c;这方面需要重点关注。今天&#xff0c;我将数据降维总结于此&#xff0c;包括他人成果&#xff0c;这里对他们的内容表示感谢。 Method 对数据降维作…

机器学习四大降维方法

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

机器学习降维方法概括

最近刷题看到特征降维相关试题&#xff0c;发现自己了解的真是太少啦&#xff0c;只知道最简单的降维方法&#xff0c;这里列出了常见的降维方法&#xff0c;有些算法并没有详细推导。特征降维方法包括&#xff1a;Lasso&#xff0c;PCA&#xff0c;小波分析&#xff0c;LDA&am…

详解机器学习高维数据降维方法

当特征选择完成后&#xff0c;可以直接训练模型了&#xff0c;但是可能由于特征矩阵过大&#xff0c;导致计算量大&#xff0c;训练时间长的问题&#xff0c;因此降低维度也是必不可少的。 常见的降维方法除了以上提到的基于 L1 惩罚项的模型以外&#xff0c;另外还有主成分分…

机器学习之降维

本周关于降维的学习主要分为五类&#xff1a;PCA、LDA、LLE、tSNE、ISOMAP 来进行学习 首先自己的任务是&#xff1a;tSNE的学习 &#xff08;一&#xff09;降维的基本知识点总结 1、降维方法分为线性和非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方…