Tomcat启动流程
一、流程简述
在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×tamp=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启动流程相关推荐
- tomcat启动流程分析
前言 tomcat究竟在启动的时候做了哪些事情呢?从直观上讲,当tomcat启动完毕后,部署在tomcat里的项目,就可以通过外部的http形式进行访问了,但有个疑问是,为什么可以访问呢?其内部都做了 ...
- Tomcat -- 启动流程
启动流程 web概念 tomcat启动原理 启动流程 启动源码 源码跟踪 startup.bat 启动文件 catalina.bat (bootstrap.jar) 启动入口 Bootstrap.ma ...
- Tomcat 启动流程
目录 一:流程 二:源码解析 1.Lifecycle 2 .各组件的默认实现 3 .源码入口 三:总结 一:流程 步骤 : 1)启动tomcat , 需要调用 bin/startup.bat (在li ...
- Tomcat核心架构和启动流程解析
HTTP请求流程 浏览器发起一个HTTP请求的流程如下: 用户通过浏览器进行了一个操作,比如输入地址并按下回车.点解某个超链接. 浏览器向服务器发起TCP连接建立请求. 浏览器与服务器通过三次握手建立 ...
- tomcat的启动流程及原理
组件介绍: Tomcat 最重要的是两个组件是:Connector(连接器) 和 Container(容器/集装箱),Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这 ...
- tomcat的启动流程
在上一篇中,我们是自己配置启动的路径.通过手动启动. 那么,再实际的操作中,我们通常用的都是core版本来使用的,里面是没有上篇我们配置的那个路径的,那么是如何启动的呢. 1,通过bin路径start ...
- 理解Tomcat架构、启动流程及其性能优化
PS:but, it's bullshit ! 备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html ...
- 启动TomCat的流程
如何使用TomCat,启动TomCat的流程 1.从官网下载下载zip压缩包后,解压到自己熟悉的位置 2.如图所示打开解压文件 3.找到tomcat下的webapps的ROOT文件夹,把咱们需要放置的 ...
- bootstrap java_查看tomcat启动文件都干点啥---Bootstrap.java
在上一章查看tomcat启动文件都干点啥---catalina.bat,说了在catalina.bat中都走了什么流程,最重要的是,我们得出了如下这段命令: _EXECJAVA=start " ...
最新文章
- spring配置druid连接池和监控数据库访问性能
- 快速排序算法-php实现
- freewheel现场宣讲笔试回忆篇
- vue判断列表中包含某一项_判断字符串中是否包含某个字符串
- 思路不清晰还想月薪过万?学会这4招,升职加薪有望
- 视觉slam十四讲 编程学习
- HTML5仿微信表情框,HTML5高仿微信聊天、微信聊天表情、对话框、编辑器功能
- 韩昊20190912-1 每周例行报告
- C++基础之detele和detele[]
- Android关于创建涂鸦板过程中出现的小问题
- python显示invalid character_python提示invalid character in identifier
- SaaS行业的六大安全问题
- matlab引用csv文件,如何用MATLAB读取csv文件
- 由浅入深了解羚珑平台统一接入服务 —— Monet
- 9.Android 万能ViewHolder
- 访问空指针一定会使程序死掉吗
- Python内置函数 vars()函数
- 强烈推介的几个微信小程序开发小技巧,简单又实用
- 第一次软件工程课程作业
- WS_EX_TOOLWINDOW 属性