Tomcat 8.5下载地址
https://tomcat.apache.org/download-80.cgi
一、Tomcat启动流程
1、Tomcat源码目录
catalina目录:apache-tomcat-8.5.42-src\java\org\apache\catalina
catalina包含所有的Servlet容器实现,以及涉及到安全、会话、集群、部署管理Servlet容器的各个方面,同时它还包含了启动入口。
coyote目录:apache-tomcat-8.5.42-src\java\org\apache\coyote
coyote是Tomcat链接器框架的名称,是Tomcat服务器提供的客户端访问的外部接口,客户端通过Coyote与服务器建立链接、发送请求并接收响应。
El目录(org.apache.el),提供java表达式语言:
- Jasper模块提供JSP引擎
- Naming模块提供JNDI的服务
- Juli提供服务器日志的服务
- tomcat提供外部调用的接口api
2、Tomcat启动流程分析
2.1、启动流程解析:
注意是标准的启动,也就是从bin目录下的启动文件中启动Tomcat
我们可以看到这个流程非常的清晰,同时注意到,Tomcat的启动非常的标准,除去Boostrap和Catalin,我们可以对照一下Server.xml的配置文件。Server,service等等这些组件都是一一对照,同时又有先后顺序。
基本的顺序是先init方法,然后再start方法。
2.2、加入调试信息():
注意是标准的启动,也就是从bin目录下的启动文件中启动Tomcat
可以看到,在源码中加入调试的信息和流程图是一致的。
我们可以看到,除了Bootstrap和catalina类,其他的Server、service等等之类的都只是一个接口,实现类均为StandardXXX类。我们来看下StandardServer类:
问题来了,我们发现StandardServer类中没有init方法,只有一个类似于init的initInternal方法,这个是为什么?带着问题我们进入下面的内容。
二、组件的生命周期管理
1、各种组件如何统一管理
Tomcat的架构设计是清晰的、模块化、它拥有很多组件,加入在启动Tomcat时一个一个组件启动,很容易遗漏组件,同时还会对后面的动态组件拓展带来麻烦。如果采用我们传统的方式的话,组件在启动过程中如果发生异常,会很难管理,比如你的下一个组件调用了start方法,但是如果它的上级组件还没有start甚至还没有init的话,Tomcat的启动会非常难管理,因此Tomcat的设计者提出一个解决方案:用Lifecycle管理启动、停止、关闭。