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应用程序。
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。