Tomcat整体架构分析

1.Tomcat介绍

官方文档:https://tomcat.apache.org/tomcat-9.0-doc/index.html

1.1 Tomcat概念

Tomcat是Apache Software Foundation(Apache软件基金会)开发的一款开源的Java Servlet容器。它是一种Web服务器,用于在服务器端运行Java Servlet和JavaServer Pages (JSP)技术。它可以为Java Web应用程序提供运行环境,并通过HTTP协议处理客户端请求。Tomcat也支持多种Web应用程序开发技术,例如JavaServer Faces (JSF)、Java Persistence API (JPA)等。总的来说,Tomcat是一款高效、稳定和易于使用的Web服务器。

Tomcat核心: Http服务器+Servlet容器

1.2 Tomcat目录结构

Tomcat的解压之后的目录可以看到如下的目录结构

bin

bin目录主要是用来存放tomcat的脚本,如startup.sh , shutdown.sh

conf
lib

公共类库

logs

tomcat在运行过程中产生的日志文件

webapps

用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序

work

用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件

1.3 web应用部署的三种方式

拷贝到webapps目录下

bash 复制代码
//指定appBase     
<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">

server.xml 的Context标签下配置Context

bash 复制代码
<Context docBase="D:\mvc" path="/mvc"  reloadable="true" />

path:指定访问该Web应用的URL入口(context-path)docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于的appBase属性的相对路径。reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。

在$CATALINA_BASE/conf/[enginename]/[hostname]/ 目录下(默认conf/Catalina/localhost)创建xml文件,文件名就是contextPath。

比如创建mvc.xml,path就是/mvc

bash 复制代码
<Context docBase="D:\mvc"  reloadable="true" />

注意:想要根路径访问,文件名为ROOT.xml

2、Tomcat整体架构分析

Tomcat 要实现 2 个核心功能:

  • 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。
  • 加载和管理 Servlet,以及具体处理 Request 请求。

因此Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。

2.1 Tomcat架构图

Tomcat的架构分为以下几个部分:

  • Connector:Tomcat的连接器,用于接收请求并将其发送给容器。
  • Container:Tomcat的容器,负责管理Servlet、JSP和静态资源的生命周期。
  • Engine:Tomcat的引擎,管理容器的生命周期和分配请求。
  • Host:Tomcat的主机,可以管理多个Web应用程序。
  • Context:Tomcat的上下文,用于管理单个Web应用程序的配置信息。
  • Servlet:Tomcat的Servlet,负责处理请求并生成响应。
  • JSP:Tomcat的JSP,用于动态生成Web内容。

总的来说,Tomcat的架构是一个分层的架构,每一层都有其自己的功能和职责。该架构可以提高Tomcat的性能和可维护性,并使得Tomcat可以支持大量的Java Web应用程序。

http://localhost:8080/mvc2/

2.2 Tomcat核心组件详解
Server 组件

指的就是整个 Tomcat 服务器,包含多组服务(Service),负责管理和启动各个Service,同时监听 8005 端口发过来的 shutdown 命令,用于关闭整个容器 。

Service组件

每个 Service 组件都包含了若干用于接收客户端消息的 Connector 组件和处理请求的 Engine 组件。 Service 组件还包含了若干 Executor 组件,每个 Executor 都是一个线程池,它可以为 Service 内所有组件提供线程池执行任务。 Tomcat 内可能有多个 Service,这样的设计也是出于灵活性的考虑。通过在 Tomcat 中配置多个 Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。

连接器Connector组件

Tomcat 与外部世界的连接器,监听固定端口接收外部请求,传递给 Container,并将Container 处理的结果返回给外部。连接器对 Servlet 容器屏蔽了不同的应用层协议及 I/O 模型,无论是 HTTP 还是 AJP,在容器中获取到的都是一个标准的 ServletRequest 对象。

容器Container组件

容器,顾名思义就是用来装载东西的器具,在 Tomcat 里,容器就是用来装载 Servlet 的。Tomcat 通过一种分层的架构,使得 Servlet 容器具有很好的灵活性。Tomcat 设计了 4 种容器,分别是 Engine、Host、Context 和 Wrapper。这 4 种容器不是平行关系,而是父子关系。

  • Engine:引擎,Servlet 的顶层容器,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine;
    Host:虚拟主机,负责 web 应用的部署和 Context 的创建。可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序;
  • Context:Web 应用上下文,包含多个 Wrapper,负责 web 配置的解析、管理所有的 Web 资源。一个Context对应一个 Web 应用程序。
  • Wrapper:表示一个 Servlet,最底层的容器,是对 Servlet 的封装,负责 Servlet 实例的创建、执行和销毁。

2.3 结合Server.xml理解Tomcat架构

我们可以通过 Tomcat 的 server.xml 配置文件来加深对 Tomcat 架构的理解。Tomcat 采用了组件化的设计,它的构成组件都是可配置的,其中最外层的是 Server,其他组件按照一定的格式要求配置在这个顶层容器中。

bash 复制代码
<Server>    //顶层组件,可以包括多个Service
    <Service>  //顶层组件,可包含一个Engine,多个连接器
        <Connector/>//连接器组件,代表通信接口		   
        <Engine>//容器组件,一个Engine组件处理Service中的所有请求,包含多个Host
            <Host>  //容器组件,处理特定的Host下客户请求,可包含多个Context
                <Context/>  //容器组件,为特定的Web应用处理所有的客户请求
	    </Host>
        </Engine>
    </Service>	
</Server>	

Tomcat启动期间会通过解析 server.xml,利用反射创建相应的组件,所以xml中的标签和源码一一对应。

2.4 请求定位 Servlet 的过程

Tomcat 是用 Mapper 组件来完成这个任务的。Mapper 组件的功能就是将用户请求的 URL 定位到一个 Servlet,它的工作原理是:Mapper 组件里保存了 Web 应用的配置信息,其实就是容器组件与访问路径的映射关系,比如 Host 容器里配置的域名、Context 容器里的 Web 应用路径,以及 Wrapper 容器里 Servlet 映射的路径,你可以想象这些配置信息就是一个多层次的 Map。当一个请求到来时,Mapper 组件通过解析请求 URL 里的域名和路径,再到自己保存的 Map 里去查找,就能定位到一个 Servlet。一个请求 URL 最后只会定位到一个 Wrapper 容器,也就是一个 Servlet。

相关推荐
小李不想输啦3 小时前
什么是微服务、微服务如何实现Eureka,网关是什么,nacos是什么
java·spring boot·微服务·eureka·架构
张铁铁是个小胖子3 小时前
微服务学习
java·学习·微服务
ggs_and_ddu3 小时前
Android--java实现手机亮度控制
android·java·智能手机
敲代码娶不了六花4 小时前
jsp | servlet | spring forEach读取不了对象List
java·spring·servlet·tomcat·list·jsp
Yhame.4 小时前
深入理解 Java 中的 ArrayList 和 List:泛型与动态数组
java·开发语言
SRExianxian5 小时前
kubernetes存储架构之PV controller源码解读
容器·架构·kubernetes
XianxinMao5 小时前
Transformer 架构对比:Dense、MoE 与 Hybrid-MoE 的优劣分析
深度学习·架构·transformer
是小崔啊6 小时前
开源轮子 - EasyExcel02(深入实践)
java·开源·excel
myNameGL6 小时前
linux安装idea
java·ide·intellij-idea
青春男大6 小时前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse