tomcat源码分析01-启动过程概览
导读:tomcat是一个开源的web服务器,它实现了我们常用的Servlet,JSP,EL等相关规范,因为其性能稳定,开源等因素得到越来越多开发者的青睐,出于学习的目的,我决定研读其源码,并将阶段性成果同步出来与大家探讨。
关键词:tomcat,web服务器
以命令行启动方式为例,结合文字说明和流程图讲述一下tomcat启动过程概览。
启动过程文字描述
- 执行startup.bat或者startup.sh
- startup.bat触发catalina.bat
- catalina.bat执行org.apache.catalina.startup.Bootstrap的main方法
- Bootstrap.init()
- 初始化类加载器
- 通过反射加载启动类,Bootstrap只是一个引导程序,真正的启动类是org.apache.catalina.startup.Catalina
- Bootstrap执行启动逻辑
- Catalina.setAwait
- Catalina.load,该方法会通过解析conf/server.xml下的配置,初始化Server对象
- initDirs,初始化一个临时目录
- initNaming,设置命名服务相关的几个环境变量
- createStartDigester,创建一个Digester用来解析server.xml,解析过程中会完成Server的装配工作,Digester原理可以参考http://commons.apache.org/proper/commons-digester/
- 加载server.xml并使用Digester解析,解析完成意味着Catalina下的server对象被初始化完成
- 将System.out和System.err重定向到ystemLogHandler类
- server.init,其init会逐层触发子元素的init方法,server.init->service.init->engine/connector.init等等
- Catalina.start,调用server.start
- 启动NamingContext并将所有JNDI引用绑定到其中
- 逐层触发子元素的start方法server.start->service.start->engine/connector.start等等
- StandardHost.start(StandardHost作为Engine的child,由engine触发其start方法)
- 将ErrorReportValve添加到pipeline中
- 配置StandardHostValve
- 启动HostConfig组件,这一步并不是显示调用,而是使用了事件机制,HostConfig监听lifecycleEvent事件
- 收到Lifecycle.START_EVENT事件时开始deployApps
- (以webapps这种方式部署应用为例)扫描webapps下目录,解析目录文件,将其封装为StandardContext对象
- StandardContext.start
- StandardContext.start执行完成会通过事件机制触发ContextConfig.configureStart,confiureStart通过解析StandardContext关联的目录完成web工程的部署,包括解析Servlet,Filter配置等,将配置元信息添加到StandContext内部
启动流程图
花了一点时间(其实挺烧脑的)制作了几张Tomat启动时的流程图,方法粒度由小到大,贴出来希望可以帮到刚入门tomcat学习的我们。
一级调用

二级调用

三级调用

四级调用

。。。省略5-N-1级,需要的可以私聊我
终极


写在最后
通过最后一张流程图相信你也意识到了tomcat启动其实是一个比较复杂的过程,我博客中描述的只是一个极其缩略的版本,后续计划是将大流程逐步分解为单篇博客可以讲清楚的子流程写出来。
如果觉得有用,请您点个推荐。
参考资料
https://tomcat.apache.org/tomcat-8.5-doc/architecture/index.html
tomcat源码分析01-启动过程概览的更多相关文章
- mybatis源码分析:启动过程
mybatis在开发中作为一个ORM框架使用的比较多,所谓ORM指的是Object Relation Mapping,直译过来就是对象关系映射,这个映射指的是java中的对象和数据库中的记录的映射,也 ...
- Nimbus<三>Storm源码分析--Nimbus启动过程
Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype="-serv ...
- workerman源码分析之启动过程
PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了 ...
- tomcat源码之connector启动过程
connector源码部分 构造函数 生命周期启动 启动endPoint 启动accepter 线程执行方法 SocketProcessor启动
- elasticSearch6源码分析(1)启动过程
1.找到bin目录,下面有elasticSearch的sh文件,查看执行过程 exec \ "$JAVA" \ $ES_JAVA_OPTS \ -Des.path.home=&qu ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...
- Tomcat源码分析——启动与停止服务
前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...
- v87.01 鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main () | 百篇博客分析 OpenHarmony 源码
本篇关键词:内核重定位.MMU.SVC栈.热启动.内核映射表 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 鸿蒙内核源码分析(汇编基础) | ...
随机推荐
- Soldier and Badges
题目链接:https://vjudge.net/problem/CodeForces-546B AC代码: #include<iostream> #include<algorithm ...
- 根据现有的数据库自动生成Django model
Django引入外部数据库还是比较方便的,首先在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动生成models模型文件 python ma ...
- VMware 虚拟机重启后获取不到ip的问题
问题: VMware 虚拟机重启后获取不到ip,如图: 解决: 打开windows服务管理器,将VMware相关服务启动. 验证: 重启网络服务后,成功获取ip.
- 接轨国际,碰撞更多科研火花——第八届ChinaSys大会专访微软亚洲研究院首席研究员张霖涛
作者:微软亚洲研究院实习生 徐祎雪 卢思奇 2015年6月5日至6日,由中国科学院深圳先进技术研究院先进计算与数字工程研究所主办的第八届中国计算机系统(ChinaSys)学术研讨会在厦门大学召开.来自 ...
- 【内推】平安产险大数据测试开发工程师,15-30k!
平安产险技术岗内部推荐-大数据测试开发工程师等-欢迎中年人和2020应届生 上班地点:深圳福田平安金融中心 另有大量 上海 北京 成都 广州 岗位 交流qq群 828186629 微信pythonte ...
- 5G-NR物理信道与调制-下行链路v1.1.0
上接<5G-NR物理信道与调制v1.1.0>下行链路 References Definitions, symbols and abbreviations 帧结构与物理资源 通用函数 上行链 ...
- Git 程序员篇
关于 Git Git 背后的故事 伟大的作品总是诞生于伟大的时代,正如 Git 同样诞生于一个英雄辈出.极富纷争的年代. 2005 年,Linux 内核开发社区正面临严峻的挑战:他们不能继续使用 Bi ...
- 设计模式-09装饰模式(Decorator Pattern)
1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...
- PyQt5之俄罗斯方块
上个礼拜有个需求,对csv里的数据按条件进行拆分计算.一想到要做计算,少不了pandas.还有个要求最好是生成命令行工具或者带有界面. 于是尝试下,使用PyQt5做了个简单的UI界面给程序包个壳子,然 ...
- Maven项目中的packaging标签
<packaging>XXX</packaging> 项目的打包类型xxx:pom.jar.war.(packing默认是jar类型). pom是最简单的打包类型,pom 项目 ...