一、前期准备1.1 概述Apache Tomcat自1999年第一个版本发布至今,已经成为一款成熟的轻量级的Java应用服务器,它深受Java研发人员喜爱。虽然它已经更新到10.x的版本,但是大部分人依然使用jdk8和9.0.x因此本文基于tomcat-9.0.x(官网下载地址为:https://tomcat.apache.org/download-90.cgi)从使用和实现的原理探究其经久不衰的奥秘。1.2 版本差异引自Apache Tomcat官网http://tomcat.apache.org/whichversion.html二、基本概念2.1 Tomcat目录和文件目录及文件说明binTomcat的启动、停止等批处理脚本和Shell脚本bin/startup.batWindows下启动Tomcatbin/startup.shLinux下启动Tomcatbin/shutdown.batWindows下停止Tomcatbin/shutdown.shLinux下停止TomcatconfTomcat的相关配置文件conf/Catalina各个虚拟机的Context配置conf/context.xml定义所有Web应用共享的Context配置,如果应用指定了context.xml则该配置被覆盖conf/catalina.propertiesTomcat环境变量配置,主要包含一些自定义类加载器的加载路径conf/catalina.policy当Tomcat在安全模式下运行时,默认采用此配置作为安全策略conf/logging.propertiesTomcat的日志配置文件,定义了日志级别和日志路径conf/server.xmlTomcat核心配置文件,用于配置链接器,监听端口,处理请求的虚拟主机等conf/tomcat-users.xmlManager模块中使用该文件中的用户进行安全认证conf/web.xml公共的web描述文件lib服务器依赖的jar包logs默认的日志存放路径webapps默认的Web应用部署目录workJSP代码生成和编译的临时目录2.1.1 Tomcat启动脚本启动# linux 系统下启动tomcat
bin/startup.sh
# windows 系统下启动tomcat
bin/startup.batIDE集成启动嵌入式启动@SpringBootApplication
public class SpringBootStarter {
public static void main(String[] args) {
SpringApplication.run(BootStarter.class,args);
}
}Debug启动1.在catalina.sh文件中加入以下的配置,并启动TomcatCATALINA_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_OPTS2.在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实例。ServiceService可以包含多个Connector,这些Connector共享同一个Container来处理请求。在一个Tomcat实例内可以包含任意多个Service实例,它们彼此独立。Connector链接器,用于监听并转化Socket请求,同时将读取的Socket请求交由Container处理,支持不同的协议以及不同的I/O实现方式。ContainerContainer表示能够执行客户端请求并返回响应的一类对象。Tomcat中存在不同级别的容器:Engine,Host,Context,Wrapper。EngineEngine表示整个Servlet引擎。在Tomcat中Engine为最高层级的容器对象。尽管Engine不是直接处理请求的容器,却是获取目标容器的入口。HostHost作为一类容器,表示Servlet引擎(Engine)中的虚拟机,与一个服务器的网络名有关,如域名等。客户端可以使用这个网络名连接服务器,这个名称必须要在DNS服务器上注册。ContextContext作为一类容器,用于表示ServletContext,在Servlet规范中,一个ServletContext即表示一个独立的Web应用。WrapperWrapper作为一类容器,用于表示Web应用中定义的Servlet。Executor共享线程池各组件之间的关系图三、小结初步了解Tomcat的一些文件目录的作用,以及源码的模块功能以及一些关键的组件和组件之间的关系。知道了Tomcat是什么,如何使用,后续我们会结合源码深入分析Tomcat各组件的功能。下一章我们来具体分析分析Tomcat启动和关闭流程(源码)。更多文章:Redis(一):单线程为何还能这么快?Redis(二):内存模型及回收算法Redis(三):持久化Redis(四):主从同步Elasticsearch(一):概述Elasticsearch(二):核心Elasticsearch(三):实战RocketMQ—NameServer总结及核心源码剖析RocketMQ—Producer(一)启动流程解密