Tomcat源码架构笔记(入口篇)

上一篇文章简单的梳理了下Tomcat的架构,这里我们分析跟踪下Tomcat是如何启动的?做了点什么?

TomcatTomcat


一点前置知识

上篇文章中说了,Tomcat有好多组件(server -> service -> Connector/Contaniner -> Engine -> Host -> Context -> Wrapper),一层套一层的。

那么Tomcat如何管理众多且复杂的组件们呢?

这里就来说下Tomcat组件生命周期统一管理接口——LifeCycie

Tomcat组件生命周期(实例创建 -> 销毁),为了统一规范管理组件的生命周期,Tomcat抽象出LifeCycie生命周期接口。

LifeCycie生命周期接口方法LifeCycie生命周期接口方法

通过LifeCycie生命周期接口方法,定义了组件的创建到销毁的完整周期。

LifeCycie生命周期接口的继承体系LifeCycie生命周期接口的继承体系

组件通过继承LifeCycie生命周期接口,自定义了每个组件在完整周期内所有动作的具体实现。


Tomcat如何启动的

Tomcat软件模式Tomcat源代码模式
Tomcat软件(jar形式)Tomcat源代码(导入开发环境运行)
conf配置conf配置(需要手工指定文件位置)
webappswebapps(需要手工指定文件位置)

根据官方文档,我们如果要软件模式启动Tomcat,需要运行bin目录下的startup.sh脚本(windows是startup.bat

首先我们分析下startup.sh文件

startup.sh文件startup.sh文件

我们发现他调用同目录下的catalina.sh文件,并添加参数start

然后我们看下catalina.sh文件

catalina.sh文件catalina.sh文件

分析Tomcat实际启动命令

是不是有点乱?我们运行下,用ps看一下具体的启动命令

Tomcat实际启动命令Tomcat实际启动命令

/usr/bin/java 
-Djava.util.logging.config.file=/home/ding/tool/apache-tomcat-8.5.55/conf/logging.properties 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
-Djdk.tls.ephemeralDHKeySize=2048 
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources 
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027 
-Dignore.endorsed.dirs= -classpath /home/ding/tool/apache-tomcat-8.5.55/bin/bootstrap.jar:/home/ding/tool/apache-tomcat-8.5.55/bin/tomcat-juli.jar 
-Dcatalina.base=/home/ding/tool/apache-tomcat-8.5.55 
-Dcatalina.home=/home/ding/tool/apache-tomcat-8.5.55 
-Djava.io.tmpdir=/home/ding/tool/apache-tomcat-8.5.55/temp 
org.apache.catalina.startup.Bootstrap start

我们发现catalina.sh实际上执行了下面的命令来真正启动tomcat

java xxx.jar org.apache.catalina.startup.Bootstrap start

所以整体启动入口流程(startup.sh -> catalina.sh start -> java xxx.jar org.apache.catalina.startup.Bootstrap start)


Tomcat在启动中做了那些工作

ok,上面我们简单的分析了Tomcat如何以工作模式启动。

现在我们打开调试模式,一步步分析Tomcat源码启动时做了些什么事情。

info:请先移步《Tomcat源码阅读环境搭建》了解详细搭建步骤

Tomcat 启动流程Tomcat 启动流程

Tomcat启动入口

Tomcat启动入口Tomcat启动入口

Bootstrap对象的初始化动作

Bootstrap对象的初始化动作Bootstrap对象的初始化动作

根据参数选择操作

根据参数选择操作根据参数选择操作

Tomcat load 加载初始化过程

  • 一级一级的初始化(对象的实例化);
  • Connector组件的Endpoint(Socket)进行通信端口bind(绑定),尚未accept(接收请求);

Tomcat load 加载初始化过程Tomcat load 加载初始化过程

Tomcat 正式启动过程

  • 一级一级的启动;
  • 开始accept(接收请求);

Tomcat 正式启动过程Tomcat 正式启动过程

添加新评论

* 已开启反垃圾保护,《隐私政策》