一、流程简述

在Tomcat的bin目录下存放着Tomcat在Windows环境下和Linux环境下的启动脚本

在start脚本文件中会去启动catalina的脚本文件

catalina脚本文件中会去调用启动类(org.apache.catalina.startup.Bootstrap)来进行Tomcat的初始化

启动的流程图如下

二、启动流程

Init 阶段

1、Bootstrap init()

利用反射机制初始化Catalina

2、Bootstrap init() -> Catalina load()

创建完Catalina对象并完成赋值后会开始初始化各个组件,这里先调用load

进入方法后设置的是load,然后通过反射去执行Catalina类的load()方法

3、Catalina 创建各个组件

这个地方会去生成server.xml文件的解析工具,来创建相关的组件(没有修改过server.xml的则是tomcat的默认配置)

里面会配置创建各个组件的规则、方法、类名

解析完成后读取文件

开始各个组件的创建

4、Catalina -> Server init()

创建完成后开始执行初始化的链路

因为Catalina内部组件都依靠Lifecycle接口来管理各组件的生命周期,所以我们主要看这个方法(这里放一张大致的接口管理类图)

这个方法是个抽象方法,因为我们第一个初始化的是Server所以我们进入这个类中

一个Server下会有多个Service,所以这里是遍历的去初始化

6、Server -> Service init()

这里会初始化Engine

7、Service -> Engine Init()

这里会调用父类的初始化,创建了一个线程池 (这里后续没有init Host- Context - Wrapper等,而是在下面Engine的start启动后直接启动)

6、Server -> Executor init()

这里我们server.xml并没有配置线程池所以没有初始化我们自己的线程池

7、Server -> Connector init()

这里会对Connector进行加载

初始化Connector的时候会创建Adapter,Adapter用于Request/Response <–> ServletRequest/ServletResponse 之间的相互转换(适配器模式)

然后初始化ProtocolHandler

9、Connector -> ProtocolHandler init()

Tomcat支持两种网络协议 HTTP 和 AJP

因为我们server.xml配置的是HTTP,所以走的是AbstractHttp11Protocol,然后回去加载父类的init()

​ 父类会初始化Endpoint

10、AbstractProtocol -> Endpoint init()

Endpoint主要的作用就是接收客户端请求的连接

绑定端口号,默认的是NioEndpoint

默认配置也是本机的8080端口

Start 阶段

11、Bootstrap -> Server start()

load中的init加载完成后就开始start各组件

先判断是否加载,然后开始start()方法

Lifecycle接口管理了组件的所有生命周期,所以start也和init是一样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJj1FlyE-1614825664644)(/Users/admain/Library/Application Support/typora-user-images/image-20210303161633971.png)]

12、Server -> Service start()

这里会启动Engine、自定义线程池 和 Connector

13、Service -> Engine start()

调用父类的启动方法

14、 Engine -> Host start()

父类这里启动会先查询Engine下的子类对象,Engine -> Host -> Context -> Wrapper, 查询到子类对象后会通过线程池去执行创建启动

StartChild是实现了Callable接口的

启动Host

启动完成后回去调用下父类的启动方法,Host这里也会去拿它的子类然后启动,但是现在是没有的

然后会去设置下生命周期状态 -> Starting

这里要提一下Lifecycle的生命周期监听器,他会监听对象的生命周期,像上面一样设置新的生命周期状态的时候(如:NEW、INIT、START等…),都会执行这个方法 – 它有多个实现,跟代码的时候要注意

这里监听到了Host的创建,当前状态为Starting

15、 Host -> Context start()

执行start() 方法

调用线程池去创建Web应用的描述对象

使用digester去解析配置文件

设置完Context的属性后,添加Host的子对象

这里还会添加对应的子对象的生命周期监听器

调用父类的方法开始启动Context

之前没有初始化Context对象,所以先init

​ 生命周期监听器监听到了Context的init

之后的初始化都是一样的,直接看start的过程

16、 Context -> Wrapper start()

之后会去加载Context的各种资源,然后到这里,设置生命周期状态为configure_start

监听器监听到这个状态后调用HostConfig,执行这个方法

这里开始加载Wrapper

根据server.xml设置Context的各种属性

创建Wrapper

设置Wrapper到Context的子对象中

之后调用父类的方法,用线程池启动Wrapper

剩下的就是把Context都加载一遍了,一个Host是有多个Context的

17、 Service -> Executor start() -> Connector start()

回到Service,Engine 启动完成后继续启动线程池,然后就是Connector

18、Connector -> ProtocolHandler start()

默认还是AbstractProtocol

19、Connector -> ProtocolHandler start()

20、ProtocolHandler -> Endpoint start()

这里会创建一个线程池,然后开启两个轮巡线程准备去监听8080端口号


这里会开启一个处理线程去处理请求

剩下的就是重复的去加载目录:home/webapps下的项目了。启动完成后,Tomcat开始等待请求进行处理。

本文为手动Debug过程中总结,如有问题,万望指出,十分感谢!

参考文档

博客:https://blog.csdn.net/sunyunjie361/article/details/58588033

Endpoint:https://www.toutiao.com/i6704513825745404423/?tt_from=copy_link&utm_campaign=client_share&timestamp=1561103290&app=news_article_lite&utm_source=copy_link&utm_medium=toutiao_ios&req_id=20190621154810010023019038398CF00&group_id=6704513825745404423

AJP : https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html

AJP漏洞:https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ

Tomcat启动流程相关推荐

  1. tomcat启动流程分析

    前言 tomcat究竟在启动的时候做了哪些事情呢?从直观上讲,当tomcat启动完毕后,部署在tomcat里的项目,就可以通过外部的http形式进行访问了,但有个疑问是,为什么可以访问呢?其内部都做了 ...

  2. Tomcat -- 启动流程

    启动流程 web概念 tomcat启动原理 启动流程 启动源码 源码跟踪 startup.bat 启动文件 catalina.bat (bootstrap.jar) 启动入口 Bootstrap.ma ...

  3. Tomcat 启动流程

    目录 一:流程 二:源码解析 1.Lifecycle 2 .各组件的默认实现 3 .源码入口 三:总结 一:流程 步骤 : 1)启动tomcat , 需要调用 bin/startup.bat (在li ...

  4. Tomcat核心架构和启动流程解析

    HTTP请求流程 浏览器发起一个HTTP请求的流程如下: 用户通过浏览器进行了一个操作,比如输入地址并按下回车.点解某个超链接. 浏览器向服务器发起TCP连接建立请求. 浏览器与服务器通过三次握手建立 ...

  5. tomcat的启动流程及原理

    组件介绍: Tomcat 最重要的是两个组件是:Connector(连接器) 和 Container(容器/集装箱),Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这 ...

  6. tomcat的启动流程

    在上一篇中,我们是自己配置启动的路径.通过手动启动. 那么,再实际的操作中,我们通常用的都是core版本来使用的,里面是没有上篇我们配置的那个路径的,那么是如何启动的呢. 1,通过bin路径start ...

  7. 理解Tomcat架构、启动流程及其性能优化

    PS:but, it's bullshit ! 备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html ...

  8. 启动TomCat的流程

    如何使用TomCat,启动TomCat的流程 1.从官网下载下载zip压缩包后,解压到自己熟悉的位置 2.如图所示打开解压文件 3.找到tomcat下的webapps的ROOT文件夹,把咱们需要放置的 ...

  9. bootstrap java_查看tomcat启动文件都干点啥---Bootstrap.java

    在上一章查看tomcat启动文件都干点啥---catalina.bat,说了在catalina.bat中都走了什么流程,最重要的是,我们得出了如下这段命令: _EXECJAVA=start " ...

最新文章

  1. spring配置druid连接池和监控数据库访问性能
  2. 快速排序算法-php实现
  3. freewheel现场宣讲笔试回忆篇
  4. vue判断列表中包含某一项_判断字符串中是否包含某个字符串
  5. 思路不清晰还想月薪过万?学会这4招,升职加薪有望
  6. 视觉slam十四讲 编程学习
  7. HTML5仿微信表情框,HTML5高仿微信聊天、微信聊天表情、对话框、编辑器功能
  8. 韩昊20190912-1 每周例行报告
  9. C++基础之detele和detele[]
  10. Android关于创建涂鸦板过程中出现的小问题
  11. python显示invalid character_python提示invalid character in identifier
  12. SaaS行业的六大安全问题
  13. matlab引用csv文件,如何用MATLAB读取csv文件
  14. 由浅入深了解羚珑平台统一接入服务 —— Monet
  15. 9.Android 万能ViewHolder
  16. 访问空指针一定会使程序死掉吗
  17. Python内置函数 vars()函数
  18. 强烈推介的几个微信小程序开发小技巧,简单又实用
  19. 第一次软件工程课程作业
  20. WS_EX_TOOLWINDOW 属性

热门文章

  1. java 定义数组属性_Java数组的定义与使用
  2. Python数据结构14:递归的原理,递归实现数列求和、求阶乘、十进制转为任意进制
  3. Android TextView 超链接显示及跳转
  4. c语言语法糖公式,C语言一些语法糖
  5. 计算机资源属于校内还是校外,KingCMS:运营地方门户站之推广总结篇(6)
  6. Shopex中的css框架
  7. jquery中用.is和.hasClass检查元素类名
  8. 使用腾讯地图驾车规划路线
  9. python文件处理助手——shutil
  10. 同学们在写论文的时候发现了哪些神仙级网站?