Tomcat底层原理

article/2025/9/14 0:43:22

一、Tomcat启动时到底对我们的应用程序做了什么?

当我们把一个应用程序的war包放到Tomcat的webapps目录后,启动Tomcat,然后就可以通过浏览器发送Http请求访问该war包内的Servlet了。
这个过程包括:
1、启动Tomcat
2、Tomcat处理Http请求
而启动Tomcat的目的就是为了处理Http请求。

一个Http请求通常是这样子的:
http://localhost:8080/app/helloServlet
这个请求包括:

协议:http
主机名:localhost
端口:8080
应用名:app
Servlet名:helloServlet

我们通俗点来理解这个Http请求就是:浏览器通过Http协议,请求localhost:8080上的myapp应用内的helloServlet。

Tomcat架构俯视图:

在这里插入图片描述

二、那分析这个Http请求有什么用呢?和Tomcat有什么关系?

当然有关系,上面这个Http请求中的localhost:8080其实代表的就是Tomcat。我们一个应用程序想要从外部接收网络数据,那就要绑定一个端口,这个跟TCP协议有关系,外部请求发送给该端口,就能被对于的程序所接收到。Tomcat也是这样,所以,Tomcat默认绑定的就是8080。

所以上面这个Http请求首先是被Tomcat接收到,然后去解析这个请求。
解析这个请求包括:

请求所使用的方法,是GET,还是POST,还是其他
所请求的应用与Servlet的名字是什么
请求所携带的数据

当Tomcat把从8080端口获取的请求解析完成后,它就应该根据应用名和Servlet名字去找Servlet实现类了,只有找到Servlet实现类才能真正执行Servlet里面的doGet或doPost方法。

所以,这里又分两步:

根据请求中的应用名和Servlet名怎么找到对应的Servlet实现类呢
怎么执行Servlet实现类中跟请求对应的方法呢

首先关于第二点,很简单:可以用***反射***
那么对于第一点该怎么实现呢?
其实也很简单,要么默认,要么映射。
默认的意思就是,请求中的Servlet名就是类名,这种可行,但是不好用,一个类还有包名的,万一在一个应用中,存在不同的包下存在名字相同的Servlet,这个时候就尴尬了。
所以最好的方式就是映射,一个Servlet名对应一个Servlet实现类。这也就是为什么我们在定义Servlet时,一定要做一个mapping关系,不管是通过@WebServlet注解还是在web.xml中,都需要配置一个mapping才能被访问到。

所以,Tomcat通过监听端口,获取数据,然后解析数据,根据请求url找到对应的Servlet实现类,然后通过反射执行Servlet实现类中的方法

这个流程并不难,如果我们自己实现,30分钟内可能就能实现出来这么一个功能,这也是Tomcat的主线功能,那么Tomcat复杂在哪呢?
其实还是复杂在这条主线,这条主线再拆分一下就是两步:

获取并解析数据
寻找并执行Servlet

在这里插入图片描述

tomcat容器对比:
在这里插入图片描述

三、Servlet

我们在来细想一下这里的第二步:寻找并执行Servlet

我们通常说Tomcat是一个Servlet容器,到底体现在哪,怎么体现的呢?
我们得先来理解一下Servlet,Servlet=Server+Applet,表达的意思就是运行在服务端的应用程序,它跟运行在客户端的应用程序是相对的,运行在客户端的应用程序,可以随着用户的操作而发生变化,而运行在服务端的应用程序,用户是不能直接操作的,你只能通过发送网络请求来操作它,这就是Servlet的由来。这也就是为什么Servlet规范里会定义ServletRequest,ServletResponse接口,都是跟请求相关的,所以,Servlet其实就为Java程序员方便处理请求和响应的一种抽象,作为Java程序员,你只需要通过定义Servlet,然后接收到的ServletRequest对象就代表请求,而不用关心ServletRequest具体的实现类是什么,是谁实现的,都不用关系,只要知道这个对象代表一个请求即可。
所以谁来实现这些接口呢?大家自然就能想到了,是Tomcat、Jetty这些了。比如Tomcat中对应的请求实现类是RequestFacade,我们在Servlet中进行强制转化是没有问题的,比如这么写:

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {RequestFacade requestFacade = (RequestFacade) req;resp.getWriter().println("luban annotation servlet");}

我们重新理解了Servlet之后,就可以再来理解Tomcat了,Tomcat确实是一个容器,但是是一个分层的容器。因为一个Servlet代表一个功能,一个应用中可以有多个Servlet,所以在Tomcat中存在Context容器,Context容器中收纳Servlet,Context就代表应用,也就是应用上下文,然后我们的应用是部署在主机上的,所以Tomcat中存在Host容器,一个Host容器中可以容纳多个Context容器,再继续,我们可能是多个主机所提供的功能属于同一范畴的,所以在Tomcat中,在Host之上还有一层Engine。所以我们说的容器包括:Engine、Host、Context。

而Tomcat除开实现了这个层级结构之外,还提供了一些辅助功能。
既然现在容器分层了,所以一个请求在寻找Servlet的过程中,就会经过每一层容器,那么每层容器在这个过程中都可以去做一些事情,并且允许用户自定义这些事情,比如可以在Host层去指定:所有请求该Host的请求都将日志打印到hostname.log文件中,或者所有请求该Host的请求都由该Host添加一下参数,其他容器也类似,这其实就是一种责任链模式,Tomcat中实现了这种模式,是通过:Pipeline和Valve实现的。

好,这是关于容器的分析。
接下来我们再来分析一下Tomcat是怎么解析请求的,上文我们分析了,Tomcat实际上就是把接收到的请求转化成RequestFacade对象,最后把这个对象传递给Servlet。
那么Tomcat的数据从哪来的呢?上文中我们一直默认Tomcat接收的是Http请求,那么这个Http请求是怎么到达Tomcat的呢?总不是凭空飞过来了的吧。
大家应该想到了,是通过网线传过来的,所以我们要分析Tomcat是怎么接收到Http请求,就要分析网络传输协议了。
首先,我们为什么需要网络传输协议呢?
网络是用来传输数据的,比如现在主机A有一份数据要发送给主机B,那么主机A在拥有数据的同时还是要知道主机B的地址,也就是IP,所以现在相当于主机A上要有:数据+对方IP地址

四、流程图

在这里插入图片描述

Tomcat:

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;

Connector:
在这里插入图片描述

四个子容器:

(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
(2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封装着一个Servlet;

上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0)
在这里插入图片描述

更多详情

五、那么Tcp是用来干什么的呢?

回到上面的场景,主机A想把数据发送给主机B,那谁来保证数据能可靠的到达对方呢?这就是Tcp协议所要做的事情。
那Http协议又是怎么回事呢?我们上面接收的Ip,Tcp都是跟传输相关的,而Http是跟应用相关的,是跟数据所表达的意义相关的,比如,主机A发一份数据给主机B之后,主机B接收到这份数据后,它要干什么呢?它要执行什么动作呢?这就是Http协议所要表达的,通过在数据中增加一些有意义的元素,比如请求方法,这样数据接收方能更快的根据Http协议解析数据,完成对应的动作。
解析的比较粗,因为这不是本文的重点,我的重点是,那么谁来实现Http协议,谁来实现Tcp协议呢?
答案是:操作系统来实现Tcp协议,比如Linux、Windows,运行在操作系统之上的其他应用程序来实现Http协议,比如浏览器、Tomcat。
比如Linux的源码中就有关于Tcp协议的实现,包括三次握手,四次挥手,都是通过c语言来实现的。那么浏览器它依照Http协议定义好数据之后,怎么利用Tcp协议发送出去呢?Tomcat怎么利用Tcp协议接收数据呢?
浏览器能不能直接调用操作系统中实现TCP协议关于发送数据的函数呢?Tomcat能不能调用对应接收数据的函数呢?
原理上是可以的,但是就像我们开发业务一样,我们不会将真正实现业务的方法直接暴露给其他人调用,而会提供一个接口,操作系统也一样,这个接口就是Socket。
所以Tomcat是通过Socket从操作系统获取数据的,拿到数据后进行解析。
而Tomcat从操作系统系统拿数据又有几种方式,也就是IO模型:BIO,NIO,AIO,这些不同的模式Tomcat都是支持的,只需要在server.xml中进行配置即可。
简单记录了一下关于Tomcat的随笔,其实关于TSocket、IO模型可以写得更多一点,限于篇幅,本篇就到此为止吧,下次继续。

在这里插入图片描述


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

相关文章

tomcat的工作原理以及简介

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

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服务器运行的,Tomcat是常用的Web服务器(兼具Servlet容器HTTP服务器功能)之一,此篇博客将从工作原理上来认识Tomcat。Tomcat作为Web服务器需要处理两类核心任务:处理 Socket 连接,负责网络字节流与Request和Re…

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是数据点映射后的低维向…