06 Tomcat 启动流程详解 Tomcat的Lifecycle生命周期接口 Tomcat 各组件的默认实现类 Server、Service、Container、Executor、Connector

在这里插入图片描述

Tomcat 启动流程

在这里插入图片描述

通过上图分析:Tomcat的启动过程非常标准化, 统一按照生命周期管理接口Lifecycle的定义进行启动。首先调用init() 方法进行组件的逐级初始化操作,然后再调用start()方法进行启动。每一级的组件除了完成自身的处理外,还要负责调用子组件响应的生命周期管理方法,组件与组件之间是松耦合的,因为我们可以很容易的通过配置文件进行修改和替换。

启动步骤:

  1. 启动tomcat , 需要调用 bin/startup.bat (在linux 目录下 , 需要调用 bin/startup.sh) , 在startup.bat 脚本中, 调用了catalina.bat。
  2. 在catalina.bat 脚本文件中,调用了BootStrap 中的main方法。
  3. 在BootStrap 的main 方法中调用了 init 方法 , 来创建Catalina 及 初始化类加载器。
  4. 在BootStrap 的main 方法中调用了 load 方法 , 在其中又调用了Catalina的load方 法。
  5. 在Catalina 的load 方法中 , 需要进行一些初始化的工作, 并需要构造Digester 对象, 用 于解析 XML。
  6. 然后在调用后续组件的初始化操作 。。。 加载Tomcat的配置文件,初始化容器组件 ,监听对应的端口号, 准备接受客户端请求。

Tomcat的Lifecycle生命周期接口

Tomcat所有的组件均存在初始化、启动、停止等生命周期方法,拥有生命周期管理的特性, 所以Tomcat在设计的时候, 基于生命周期管理抽象成了一个接口 Lifecycle ,而组件 Server、Service、Container、Executor、Connector 组件 , 都实现了一个生命周期的接口。

生命周期中的核心方法

  • init():初始化组件
  • start():启动组件
  • stop():停止组件
  • destroy():销毁组件

在这里插入图片描述

Tomcat 各组件的默认实现类

Tomcat的 Server、Service、Engine、Host、Context都是接口。 实际执行的时这些接口的实现类。
在这里插入图片描述

接口默认实现
ServerStanderdServer
ServiceStanderdService
EngineStanderdEngine
HostStanderdHost
ContextStanderdContext
Endpoint组件没有接口但提供一个抽象类AbstractEndpoint

Endpoint组件在《Tomcat 连接器 Coyote》文章中也提到过。

Endpoint组件在Tomcat中没有对应的Endpoint接口, 但是有一个抽象类 AbstractEndpoint 。其下有三个实现类: NioEndpoint、Nio2Endpoint、AprEndpoint , 这三个实现类分别对应于前面讲解链接器 Coyote时, 提到的链接器支持的三种IO模型:NIO,NIO2,APR 。

Tomcat8.5版本中,默认采用的是 NioEndpoint。

在这里插入图片描述

ProtocolHandler : Coyote协议接口,通过封装Endpoint和Processor , 实现针对具体协议的处理功能。

Tomcat按照协议和IO提供了6个实现类。

AJP协议:

  • AjpNioProtocol :采用NIO的IO模型。
  • AjpNio2Protocol:采用NIO2的IO模型。
  • AjpAprProtocol :采用APR的IO模型,需要依赖于APR库。

HTTP协议:

  • Http11NioProtocol :采用NIO的IO模型,默认使用的协议(如果服务器没有安装APR)。
  • Http11Nio2Protocol:采用NIO2的IO模型。
  • Http11AprProtocol :采用APR的IO模型,需要依赖于APR库。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Tomcat启动流程可以通过对源码的分析来理解。在Tomcat中,整个启动和关闭过程是按照一定规则进行的,通过Lifecycle接口来管理组件生命周期。\[2\]在启动过程中,父组件会调用子组件的init()和start()方法。因此,只要调用最顶层组件也就是Server组件的init()和start()方法,整个Tomcat就会被启动起来。\[2\] 在启动过程中,涉及到的组件需要进行初步梳理,并结合server.xml中的标签来理解各个组件的作用。可以通过Tomcat的架构设计图来进行梳理和修正。\[1\]在启动过程中,还涉及到了模板方法的设计模式,其中抽象方法会被具体的子实现。这个过程可能会有一些绕,但是通过对源码的调试和理解,可以逐步搞清楚整个启动流程。\[1\] 此外,由于Tomcat定义了自己的Request来存放客户端发来的请求信息,而这个Request对象不是标准的ServletRequest。为了解决这个问题,Tomcat引入了CoyoteAdapter,通过适配器模式将Tomcat Request转换成ServletRequest,再调用容器的Service方法。\[3\] 总结起来,Tomcat启动流程可以通过对源码的分析和调试来理解,其中涉及到组件的初始化和启动过程,以及对请求信息的处理和适配。 #### 引用[.reference_title] - *1* [Tomcat-启动流程](https://blog.csdn.net/wyy546792341/article/details/126576803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Tomcat主要结构和启动流程](https://blog.csdn.net/songcf_faith/article/details/124653240)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值