Tomcat架构
- 其中比较核心的组件就是Connector和Contaioner组件。
- Bootstrap类是启动类,mian方法是启动入口,Bootstrap创建并操作Catalina类完成服务启动。应用程序构建了一个类加载器,用于加载 Catalina 内部类(通过累积在“catalina.home”下的“server”目录中找到的所有 JAR 文件),并启动容器的常规执行。 这种迂回方法的目的是将 Catalina 内部类(以及它们所依赖的任何其他类,例如 XML 解析器)保留在系统类路径之外,因此对应用程序级类不可见。
- Catalina类可以认为是Tomcat本身,包含一个Server。负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理。
- Server类代表整个 Catalina servlet 容器。 一个Server可能包含一个或多个Services。也实现了Lifecycle接口 ,这样当start()和stop()方法被调用时,所有定义的Services也会被启动或停止。
- Service是一组一个或多个连接器,它们共享一个容器来处理它们的传入请求。 例如,这种安排允许非 SSL 和 SSL 连接器共享相同的 Web 应用程序群。一个 JVM 可以包含任意数量的 Service 实例; 但是,它们彼此完全独立,仅共享系统类路径上的基本 JVM 设施和类。
- Connector
- 名称为:coyote
- Connector负责处理网络连接,转化ServletRequest请求发送到Container中,接收Container的ServletResponse,转为网络连接
- ProtocolHandler:组合Endpoint 和 Processor,实现协议处理。按照协议和IO类型共用6个实现类:AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol
- EndPoint:使用Socket解析IP和TCP协议
- Processor:接收EndPoint的Socket,解析Http/Ajp协议,将socket中的输入流转化为成Tomcat Request
- Adapter:将Tomcat Request转化为ServletRequest
- Container
- 负责处理servlet请求
- Engine:Catalina的Servlet引擎
- Host:代表⼀个虚拟主机,或者说⼀个站点
- Context:表示⼀个Web应⽤
- Wrapper:表示⼀个Servlet
tomcat启动流程图
tomcat请求处理流程图
Tomcat类加载
博客:https://www.jianshu.com/p/51b2c50c58eb
- 引导类加载器 和 扩展类加载器 的作⽤不变
- 系统类加载器正常情况下加载的是 CLASSPATH 下的类,但是 Tomcat 的启动脚本并未使⽤该变量,⽽是加载tomcat启动的类,⽐如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下
- Common 通⽤类加载器加载Tomcat使⽤以及应⽤通⽤的⼀些类,位于CATALINA_HOME/lib下,⽐如servlet-api.jar
- Catalina ClassLoader ⽤于加载服务器内部可⻅类,这些类应⽤程序不能访问
- Shared ClassLoader ⽤于加载应⽤程序共享类,这些类服务器不会依赖
- Webapp ClassLoader,每个应⽤程序都会有⼀个独⼀⽆⼆的Webapp ClassLoader,他⽤来加载本应⽤程序 /WEB-INF/classes 和 /WEB-INF/lib 下的类。
通过这种设计,Tomcat可以做到 - JDK和CATALINA_HOME/bin,CATALINA_HOME/lib下的类复用
- Tomcat内部类和应用程序类相互隔离
- 每个web应用的类相互隔离
tomcat Lifecycle和监听器
https://www.jianshu.com/p/2a9ffbd00724
https://blog.csdn.net/qq_36838191/article/details/80054236
tomcat热部署
定义
tomcat处于运行状态时,能够监测webapps下的文件,如果有新的web应用加入进来,会自运发布这个WEB应用。
配置
tomcat的server.xml的标签autoPlay设置为true。(默认为true)