一、前期准备
1.1 概述
Apache Tomcat自1999年第一个版本发布至今,已经成为一款成熟的轻量级的Java应用服务器,它深受Java研发人员喜爱。虽然它已经更新到10.x的版本,但是大部分人依然使用jdk8和9.0.x因此本文基于tomcat-9.0.x(官网下载地址为: tomcat.apache.org/download-90…
1.2 版本差异
引自Apache Tomcat官网
tomcat.apache.org/whichversio…
二、基本概念
2.1 Tomcat目录和文件
目录及文件 | 说明 |
---|---|
bin | Tomcat的启动、停止等批处理脚本和Shell脚本 |
bin/startup.bat | Windows下启动Tomcat |
bin/startup.sh | Linux下启动Tomcat |
bin/shutdown.bat | Windows下停止Tomcat |
bin/shutdown.sh | Linux下停止Tomcat |
conf | Tomcat的相关配置文件 |
conf/Catalina | 各个虚拟机的Context配置 |
conf/context.xml | 定义所有Web应用共享的Context配置,如果应用指定了context.xml则该配置被覆盖 |
conf/catalina.properties | Tomcat环境变量配置,主要包含一些自定义类加载器的加载路径 |
conf/catalina.policy | 当Tomcat在安全模式下运行时,默认采用此配置作为安全策略 |
conf/logging.properties | Tomcat的日志配置文件,定义了日志级别和日志路径 |
conf/server.xml | Tomcat核心配置文件,用于配置链接器,监听端口,处理请求的虚拟主机等 |
conf/tomcat-users.xml | Manager模块中使用该文件中的用户进行安全认证 |
conf/web.xml | 公共的web描述文件 |
lib | 服务器依赖的jar包 |
logs | 默认的日志存放路径 |
webapps | 默认的Web应用部署目录 |
work | JSP代码生成和编译的临时目录 |
2.1.1 Tomcat启动
# linux 系统下启动tomcat
bin/startup.sh
# windows 系统下启动tomcat
bin/startup.bat
IDE集成启动
@SpringBootApplication
public class SpringBootStarter {
public static void main(String[] args) {
SpringApplication.run(BootStarter.class,args);
Debug启动
1.在catalina.sh文件中加入以下的配置,并启动Tomcat
CATALINA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.1.2
-agentlib:jdwp=transport=dt_socket,address=15833,suspend=n,server=y"
export CATALINA_OPTS
2.在IDEA中配置 Tomcat Server Remote设置jmx端口为1099,Transport Socket端口为15833即可远程调试。
2.2 Tomcat项目源码目录结构
2.2.1 源码模块层次图
Tomcat本质上是一款Servlet容器,因此Catalina是Tomcat的核心,其他模块均为Catalina提供支撑。通过Coyote模块提供链接通信,Jasper模块提供JSP引擎,Naming提供JNDI服务,Juli提供日志服务。
2.2.2 Tomcat组件说明
组件名称 说明 Server 表示整个Servlet容器,Tomcat运行环境中只有唯一一个Server实例。 Service Service可以包含多个Connector,这些Connector共享同一个Container来处理请求。在一个Tomcat实例内可以包含任意多个Service实例,它们彼此独立。 Connector 链接器,用于监听并转化Socket请求,同时将读取的Socket请求交由Container处理,支持不同的协议以及不同的I/O实现方式。 Container Container表示能够执行客户端请求并返回响应的一类对象。Tomcat中存在不同级别的容器:Engine,Host,Context,Wrapper。 Engine Engine表示整个Servlet引擎。在Tomcat中Engine为最高层级的容器对象。尽管Engine不是直接处理请求的容器,却是获取目标容器的入口。 Host Host作为一类容器,表示Servlet引擎(Engine)中的虚拟机,与一个服务器的网络名有关,如域名等。客户端可以使用这个网络名连接服务器,这个名称必须要在DNS服务器上注册。 Context Context作为一类容器,用于表示ServletContext,在Servlet规范中,一个ServletContext即表示一个独立的Web应用。 Wrapper Wrapper作为一类容器,用于表示Web应用中定义的Servlet。 Executor 共享线程池
各组件之间的关系图
初步了解Tomcat的一些文件目录的作用,以及源码的模块功能以及一些关键的组件和组件之间的关系。知道了Tomcat是什么,如何使用,后续我们会结合源码深入分析Tomcat各组件的功能。
下一章我们来具体分析分析Tomcat启动和关闭流程(源码)。