深入剖析Tomcat原理

article/2025/9/14 0:44:36

深入剖析Tomcat原理

一、 Tomcat源码部署和运行(intellij IDEA)
1、下载tomcat源码,以tomcat-8为例
链接: https://tomcat.apache.org/
在这里插入图片描述
在这里插入图片描述
2、源码部署到IDEA中

①创建新的空工程
在这里插入图片描述
②解压源码压缩包到该工程的目录(目录名最好是非中文和非空格组成的)下
在这里插入图片描述
③创建home文件,并将webapps和conf文件移入home文件中,目的是为了后期配置IDEA运行时参数时方便
在这里插入图片描述
④新建pom.xml文件,在其中添加tomcat运行时依赖:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.apache.tomcat</groupId><artifactId>apache‐tomcat‐8.5.42‐src</artifactId><name>Tomcat8.5</name><version>8.5</version><build><finalName>Tomcat8.5</finalName><sourceDirectory>java</sourceDirectory><!-- <testSourceDirectory>test</testSourceDirectory>--><resources><resource><directory>java</directory></resource></resources><!--<testResources><testResource><directory>test</directory></testResource></testResources>--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3</version><configuration><encoding>UTF-8</encoding><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.easymock</groupId><artifactId>easymock</artifactId><version>3.4</version></dependency><dependency><groupId>ant</groupId><artifactId>ant</artifactId><version>1.7.0</version></dependency><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.6.2</version></dependency><dependency><groupId>javax.xml</groupId><artifactId>jaxrpc</artifactId><version>1.1</version></dependency><dependency><groupId>org.eclipse.jdt.core.compiler</groupId><artifactId>ecj</artifactId><version>4.5.1</version></dependency></dependencies>
</project>

⑤在这个空project项目新建maven项目:
在这里插入图片描述
⑥新建完maven项目后,添加application(用来启动/调试这些源码)
在这里插入图片描述
在这里插入图片描述
找到**java/org.apache/catalina/startup/bootstrap(类)**点击完成添加(主要是这个类就是整个tomcat启动的类,其中包含main()方法)
这时有可能添加错误,因为没有导入jdk
在这里插入图片描述
⑦不报错后设置运行时参数:
在这里插入图片描述
在这里插入图片描述
就是选择刚刚新建的home目录路径
参数:
-Dcatalina.home=C:/Users/14047/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home
-Dcatalina.base=C:/Users/14047/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=C:/Users/14047/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home/conf/logging.properties
注意

⑧以上设置无误后则可以启动
在这里插入图片描述
⑨浏览器访问Tomcat会出现问题:
在这里插入图片描述
原因:
在这里插入图片描述
解决:
搜索并找到这个ContextConfig类下的configureStart()方法
在这里插入图片描述
在该方法中的webConfig()方法下添加:
context.addServletContainerInitializer(new JasperInitializer(), null)
目的是手动将JSP解析器初始化
在这里插入图片描述
重新启动Tomcat问题解决
在这里插入图片描述
二、不得不提的HTTP工作流程与DNS解析详细过程

HTTP工作流程与DNS解析详解.

三、Tomcat整体架构

1)Http服务器的执行逻辑的两种方法:
1、Http服务器接收请求,根据请求先做一个判断,找到对应的业务类执行具体业务逻辑,这种方法耦合度过高(不推荐)
在这里插入图片描述
2、Http服务器不亲自调用业务类,而是直接把请求转发给tomcat,由tomcat去判断需要调用具体哪个类来执行业务操作。
显然第二种方法解耦合度比较好。
在这里插入图片描述
2)连接器+容器
Tomcat整体包含两大组件:连接器+容器 = service
这两大组件分别与之对应的是http服务器、servlet容器

1、 连接器:主要负责客户端浏览器传过来的请求+初始化request和response
2、 容器主要负责处理某个具体servlet的调用逻辑

浏览器发出请求----->连接器首先接收请求,构建request对象,在request对象构建中解析请求信息,封装相关属性(url、method…)。----->连接器将构建好的request对象传递给容器处理------->容器拿到request,根据request对象中的信息定位到哪个具体的servlet,并初始化且调用该servlet执行具体逻辑------>容器在调用某个servlet前已经将response对象构建好了,servlet执行完具体业务逻辑后,response对象中会包含响应数据,容器再将包含响应数据的response对象再响应回给连接器。------>连接器解析完response后再响应给浏览器

四、Tomcat整体架构——连接器(Coyote)与容器初讲
在这里插入图片描述
连接器在tomcat中称为coyote
Coyote主要负责底层socket连接的接收与响应,接收到浏览器的请求后,构建并封装进request对象,最终再转换成servletRequest对象传递给容器
将协议的处理、io的相关等操作交给coyote,将具体业务逻辑的操作等交给容器
一个service可以有多个连接器coyote和一个容器,但它们都不能单独对外提供服务,两者结合为service后,一个service才能对外提供服务。

一个service至少包含一个连接器和容器。
通过service接口就可看出其对应关系
向Service中添加Connector,可以是数组(add……)
在这里插入图片描述
给service设置一个容器只能是一个(set……)
在这里插入图片描述
连接器组件coyote的内部细节

1)连接器组件coyote的内部细节:

在这里插入图片描述
一个连接器中包含了四个组件:EndPoint、Processor、Adapter、ProtocolHandler
客户端浏览器发送请求至EndPoint(通信端点(专门用来接收发送过来的socket请求)),
EndPoint处理完后将请求又发送给处理器Processor,Processor将请求按照HTTP协议格式进行解析,拆封并封装成request对象。
对容器来说它只支持servletRequest规范,而对Processor来说它只提供Request,这时就需要用到适配器组件,将Request转换为servletRequest。

2)service中容器和连接器的整体地位
在这里插入图片描述
从源码中也能看出来,是一一对应的,一个service中有很多组件,核心就是容器在这里插入图片描述
catalina:这个包包含启动项、容器、连接器(整体)、公共类等
coyote:这个包包含连接器(connector)下的各个组件(protocolHandler、adapter、processor等)

3)service内部细节
在这里插入图片描述
Contain(容器)具体结构详解:
在这里插入图片描述
Engine(引擎):管理多个虚拟站点(虚拟主机),也是一个service只能有一个引擎。一个引擎可管理多个Host。一个Host可包含多个Context(项目),一个Context下包含多个Wrapper(servlet)

通过server.xml就可以看出其中的层次关系与上描述相符
在这里插入图片描述
通过源码分析看出
容器中包含着这四个组件
在这里插入图片描述
五、Tomcat源码基础上深入分析启动流程
Tomcat启动时序图:
在这里插入图片描述
1、用户点击startup.bat即可启动tomcat
在这里插入图片描述
Startup.bat文件中的具体细节:
在这里插入图片描述
其中调用了catalina.bat这个文件
在这里插入图片描述
catalina.bat这个文件中又调用了bootStrap类中的main()方法来开启整个tomcat的启动
在这里插入图片描述
六、上手Debug 源码跟踪Tomcat各个步骤

明确tomcat入口点为BootStrap类中的main()方法:
Startup.bat—>Catalina.bat---->Bootstrap.main()
1、Application让Bootstrap.main()方法启动,此方法一启动Bootstrap类的静态属性先初始化
在这里插入图片描述
在这里插入图片描述
//获取到home文件目录
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
2、初始化完静态变量后来到main()方法体:
构建BootStrap,给非静态属性赋初值null
在这里插入图片描述
在这里插入图片描述
3、bootstrap.init()方法执行,初始化Bootstrap
在这里插入图片描述
①初始化类加载器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
② 反射创建Catalina(容器)组件
在这里插入图片描述
Catalina组件的配置是依靠配置文件(server.xml)
在这里插入图片描述
最后init()方法结束,Catalina组件成功构建
在这里插入图片描述
初始化完成之后继续往下走:

③ 调用load方法:
匹配命令参数(“start”)
在这里插入图片描述
bootstrap调用load()方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上可以看出:BootStrap的load()方法主要功能就是去调用Catalina组件的load方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述Server.xml配置文件解析的相关设置完成,返回digester
在这里插入图片描述
在这里插入图片描述
Parse这一步是核心,因为这里在解析server.xml配置文件的同时时已将server接口的一个实现类创建出来(standardServer),并依据配置文件中的值,给standardServer的各个属性设置好相应的值,其中就包括services数组等
Parse前:
在这里插入图片描述
Parse后:
在这里插入图片描述

services(Server)中只有一个名为Server01的service
server.xml
在这里插入图片描述
这些组件在这一步只是依照server配置文件的配置项被构建出来,但组件中的一些必须的初始化还是要等到后续的init()方法完成。

④ 创建完Server后开始进行初始化init()
在这里插入图片描述
这里getServer()拿到Server,实现Server接口的是standardServer类
在这里插入图片描述
在这里插入图片描述
Server.init()根据多态,调用standardServer的init方法,standardServer无init()方法,根据继承默认调用父类 LifecycleMBeanBase的init()方法,发现LifecycleMBeanBase也无此方法
在这里插入图片描述
,则又去默认调用父类LifecycleBase的init()方法,诶发现有
在这里插入图片描述
则执行init()方法中的具体逻辑(this=standardServer,this.super.super.init()),其中又有initInternal()方法执行,此方法为抽象方法,standardServer中已实现,this.super.super.initInternal()调用时传的是this也就是standardServer,所以又跑回去执行standardServer中initInternal()方法具体逻辑
initInternal()方法中核心点就是对services数组中的每一个service进行初始化:
在这里插入图片描述
*(LifecycleMBeanBase类实现了LifeCycle接口,并抽取且提供了一些相同的代码功能,standardServer继承此类,重写相应方法,其它配置直接调用父类方法即可(模板思想)。)

⑤ 初始化每个service时同样利用多态思想,与server的初始化大致相同
在这里插入图片描述
This.super.super.init()方法初始化,其中initInternal()传递this,调用standardService的
在这里插入图片描述
引擎等都属于容器范畴,所以又多继承了一层containerBase
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也就是:this.super.super.super.init(),同样的其中initInternal()还是回到StrandardEngine类中
在这里插入图片描述
引擎(Engine)初始化完毕。


http://chatgpt.dhexx.cn/article/b25qAg71.shtml

相关文章

Springboot内置Tomcat原理

SpringBoot的启动主要是通过实例化SpringApplication来启动的&#xff0c;启动过程主要做了以下几件事情&#xff1a;配置属性、获取监听器&#xff0c;发布应用开始启动事件初、始化输入参数、配置环境&#xff0c;输出banner、创建上下文、预处理上下文、刷新上下文、再刷新上…

【springboot】自动整合Tomcat原理

通过前面我们会SpringBoot的自动配置机制、Starter机制、启动过程的底层分析&#xff0c;我们拿一个实际的业务案例来串讲一下&#xff0c;那就是SpringBoot和Tomcat的整合。 我们知道&#xff0c;只要我们的项目添加的starter为&#xff1a;spring-boot-starter-web&#xff…

总结:SpringBoot内嵌Tomcat原理

一、介绍 一般我们启动web服务都需要单独的去安装tomcat&#xff0c;而Springboot自身却直接整合了Tomcat&#xff0c;什么原理呢&#xff1f; 二、原理 SpringBoot应用只需要引入spring-boot-starter-web中这个依赖&#xff0c;应用程序就默认引入了tomcat依赖&#xff0c;其…

Tomcat的架构原理

一、前言 Tomcat服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用&#xff0c;是开发和调试Servlet、JSP程序的首选。同时它是运行在JVM中的一个进程&#xff0c;包含Web容器&#xff0c;相当于是Web容器和JVM之间的中间件。 二、…

浅析tomcat原理

浅析tomcat原理 上上个星期&#xff0c;看了一下how tomcat works这本书&#xff0c;今天捡起来看一会&#xff0c;发现忘得有点快&#xff0c;特地写点东西&#xff0c;加深一下记忆。因为书讲的是tomcat4&#xff0c;5的内容&#xff0c;比较旧了&#xff0c;所以和最新的to…

Tomcat底层原理

一、Tomcat启动时到底对我们的应用程序做了什么&#xff1f; 当我们把一个应用程序的war包放到Tomcat的webapps目录后&#xff0c;启动Tomcat&#xff0c;然后就可以通过浏览器发送Http请求访问该war包内的Servlet了。 这个过程包括&#xff1a; 1、启动Tomcat 2、Tomcat处理H…

tomcat的工作原理以及简介

Tomcat简介 Tomcat是一个JSP/Servlet容器。其作为Servlet容器&#xff0c;有三种工作模式&#xff1a;独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器&#xff0c; 1.Tomcat是运行在JVM中的一个进程。它定义为【中间件】&#xff0c;顾名思义&#xff0c;是一个…

tomcat组成及工作原理

1 - Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servlet container. (Singleton) 1.2 - Service A Service element represents the combination of one or more Connector components that share a single Engine Servic…

Tomcat工作原理介绍

Web应用程序都是靠Web服务器运行的&#xff0c;Tomcat是常用的Web服务器(兼具Servlet容器HTTP服务器功能)之一&#xff0c;此篇博客将从工作原理上来认识Tomcat。Tomcat作为Web服务器需要处理两类核心任务&#xff1a;处理 Socket 连接&#xff0c;负责网络字节流与Request和Re…

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

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

Tomcat工作原理之运行机制

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

tomcat 工作原理

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

Tomcat的原理及架构

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

Tomcat基本原理

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

tomcat的工作原理

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

Tomcat原理整理

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

Tomcat工作原理详细介绍

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

Tomcat原理

Tomcat顶层架构 Tomcat的顶层结构图&#xff1a; 1、Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。 2、Service主要包含两个部分&#xff1a;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;用来检测我们书写…