Tomcat都没吃透,还算得上Java老司机?

377 阅读3分钟

一、前期准备

1.1 概述

Apache Tomcat自1999年第一个版本发布至今,已经成为一款成熟的轻量级的Java应用服务器,它深受Java研发人员喜爱。虽然它已经更新到10.x的版本,但是大部分人依然使用jdk8和9.0.x因此本文基于tomcat-9.0.x(官网下载地址为:tomcat.apache.org/download-90…

1.2 版本差异

image.png

引自Apache Tomcat官网

tomcat.apache.org/whichversio…

二、基本概念

2.1 Tomcat目录和文件

目录及文件说明
binTomcat的启动、停止等批处理脚本和Shell脚本
bin/startup.batWindows下启动Tomcat
bin/startup.shLinux下启动Tomcat
bin/shutdown.batWindows下停止Tomcat
bin/shutdown.shLinux下停止Tomcat
confTomcat的相关配置文件
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.bat
  • IDE集成启动

image.png

image.png

  • 嵌入式启动
@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 源码模块层次图

image.png

Tomcat本质上是一款Servlet容器,因此Catalina是Tomcat的核心,其他模块均为Catalina提供支撑。通过Coyote模块提供链接通信,Jasper模块提供JSP引擎,Naming提供JNDI服务,Juli提供日志服务。

image.png

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共享线程池

各组件之间的关系图

image.png

三、小结

初步了解Tomcat的一些文件目录的作用,以及源码的模块功能以及一些关键的组件和组件之间的关系。知道了Tomcat是什么,如何使用,后续我们会结合源码深入分析Tomcat各组件的功能。

下一章我们来具体分析分析Tomcat启动和关闭流程(源码)。