Tomcat源码架构笔记(入口篇)
warning:
这篇文章距离上次修改已过1616天,其中的内容可能已经有所变动。
上一篇文章简单的梳理了下Tomcat的架构,这里我们分析跟踪下Tomcat是如何启动的?做了点什么?
一点前置知识
上篇文章中说了,Tomcat有好多组件(server -> service -> Connector/Contaniner -> Engine -> Host -> Context -> Wrapper),一层套一层的。
那么Tomcat如何管理众多且复杂的组件们呢?
这里就来说下Tomcat组件生命周期统一管理接口——LifeCycie
Tomcat组件生命周期(实例创建 -> 销毁),为了统一规范管理组件的生命周期,Tomcat抽象出LifeCycie
生命周期接口。
通过LifeCycie生命周期接口方法,定义了组件的创建到销毁的完整周期。
组件通过继承LifeCycie生命周期接口,自定义了每个组件在完整周期内所有动作的具体实现。
Tomcat如何启动的
Tomcat软件模式 | Tomcat源代码模式 |
---|---|
Tomcat软件(jar形式) | Tomcat源代码(导入开发环境运行) |
conf配置 | conf配置(需要手工指定文件位置) |
webapps | webapps(需要手工指定文件位置) |
根据官方文档,我们如果要软件模式启动Tomcat,需要运行bin目录下的startup.sh
脚本(windows是startup.bat
)
首先我们分析下startup.sh
文件
我们发现他调用同目录下的catalina.sh
文件,并添加参数start
然后我们看下catalina.sh
文件
分析Tomcat实际启动命令
是不是有点乱?我们运行下,用ps看一下具体的启动命令
/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启动入口
Bootstrap对象的初始化动作
根据参数选择操作
Tomcat load 加载初始化过程
- 一级一级的初始化(对象的实例化);
- Connector组件的Endpoint(Socket)进行通信端口bind(绑定),尚未accept(接收请求);
Tomcat 正式启动过程
- 一级一级的启动;
- 开始accept(接收请求);