1. Tomcat介绍
1.1. 介绍
这边使用的是Tomcat9来做说明,本章节先对Tomcat架构和设计有个整体认识。后续章节会对Tomcat性能调优做说明。
官方文档介绍
https://tomcat.apache.org/tomcat-9.0-doc/index.html
1.2. 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.3. Tomcat目录结构
Tomcat的解压之后的目录可以看到如下的目录结构。
bin
bin目录主要是用来存放tomcat的脚本,如startup.sh , shutdown.sh
conf
catalina.policy: Tomcat安全策略文件,控制JVM相关权限,具体可以参考java. security.Permission
catalina.properties : Tomcat Catalina行为控制配置文件,比如Common ClassLoader
logging.properties : Tomcat日志配置文件, JDK Logging
server.xml : Tomcat Server配置文件
GlobalNamingResources :全局JNDI资源
context.xml :全局Context配置文件
tomcat-users.xml : Tomcat角色配置文件
web.xml : Servlet标准的web.xml部署文件, Tomcat默认实现部分配置入内:
org.apache.catalina.servlets.DefaultServlet
org.apache.jasper.servlet.JspServlet
lib
公共类库
logs
tomcat在运行过程中产生的日志文件
webapps
用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序
work
用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件
1.4. web应用部署的三种方式
Tomcat的web应用支持war包部署,文件夹部署,描述符部署。
1.4.1. war包部署和文件夹部署
默认情况下,项目war包和文件夹拷贝到webapps目录下就行。war包会自动解压成war包名称的文件夹。
该目录跟Host标签的appBase有关。
//指定appBase
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
autoDeploy:表示支持热部署。
1.4.2. 描述符部署
在server.xml 的Context标签下配置Context。比如下面这样,比较常用的描述符部署。
<Context docBase="D:\mvc" path="/mvc" reloadable="true" />
path:指定访问该Web应用的URL入口(context-path)。
docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>
的appBase属性的相对路径。
reloadable:如果这个属性设为true,支持热加载,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
1.4.3. 比较特殊的部署
在$CATALINA_BASE/conf/[enginename]/[hostname]/ 目录下(默认conf/Catalina/localhost)创建xml文件,文件名就是contextPath。比如创建mvc.xml,path就是/mvc。
这种方式不需要重启应用,就可以部署应用。
<Context docBase="D:\mvc" reloadable="true" />
注意
想要根路径访问,文件名就设置为ROOT.xml。
2. Tomcat整体架构分析
Tomcat 要实现 2 个核心功能:
处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。
加载和管理 Servlet,以及具体处理 Request 请求。
因此 Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。
2.1. Tomcat架构图
Tomcat的架构分为以下几个部分:
1. Connector:Tomcat的连接器,用于接收请求并将其发送给容器。
2. Container:Tomcat的容器,负责管理Servlet、JSP和静态资源的生命周期。
3. Engine:Tomcat的引擎,管理容器的生命周期和分配请求。
4. Host:Tomcat的主机,可以管理多个Web应用程序。
5. Context:Tomcat的上下文,用于管理单个Web应用程序的配置信息。
6. Servlet:Tomcat的Servlet,负责处理请求并生成响应。
7. JSP:Tomcat的JSP,用于动态生成Web内容。
总的来说,Tomcat的架构是一个分层的架构,每一层都有其自己的功能和职责。该架构可以提高Tomcat的性能和可维护性,并使得Tomcat可以支持大量的Java Web应用程序。
其中四大容器分别是Engine,Host,Context,Wrapper。其标准实现分别有StandardEngine,StandardHost,StandardContext,StandardWrapper,都实现了org.apache.catalina.Container接口。
2.2. Tomcat核心组件详解
2.2.1. Server 组件
指的就是整个 Tomcat 服务器,包含多组服务(Service),负责管理和启动各个Service,同时监听8005端口发过来的 shutdown 命令,用于关闭整个容器 。
2.2.2. Service组件
每个 Service 组件都包含了若干用于接收客户端消息的 Connector 组件和处理请求的 Engine 组件。 Service 组件还包含了若干 Executor 组件,每个 Executor 都是一个线程池,它可以为 Service内所有组件提供线程池执行任务。 Tomcat 内可能有多个 Service,这样的设计也是出于灵活性的考虑。通过在Tomcat 中配置多个 Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。
2.2.3. 连接器Connector组件
Tomcat 与外部世界的连接器,监听固定端口接收外部请求,传递给 Container,并将Container处理的结果返回给外部。连接器对 Servlet 容器屏蔽了不同的应用层协议及 I/O 模型,无论是 HTTP还是 AJP,在容器中获取到的都是一个标准的 ServletRequest 对象。
2.2.4. 容器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,其他组件按照一定的格式要求配置在这个顶层容器中。
<Server> //顶层组件,可以包括多个Service
<Service> //顶层组件,可包含一个Engine,多个连接器
<Connector/>//连接器组件,代表通信接口
<Engine>//容器组件,一个Engine组件处理Service中的所有请求,包含多个Host
<Host> //容器组