导读:tomcat是一个开源的web服务器,它实现了我们常用的Servlet,JSP,EL等相关规范,因为其性能稳定,开源等因素得到越来越多开发者的青睐,出于学习的目的,我决定研读其源码,并将阶段性成果同步出来与大家探讨。

关键词:tomcat,web服务器

以命令行启动方式为例,结合文字说明和流程图讲述一下tomcat启动过程概览。

启动过程文字描述

  1. 执行startup.bat或者startup.sh
  2. startup.bat触发catalina.bat
  3. catalina.bat执行org.apache.catalina.startup.Bootstrap的main方法
    1. Bootstrap.init()
      1. 初始化类加载器
      2. 通过反射加载启动类,Bootstrap只是一个引导程序,真正的启动类是org.apache.catalina.startup.Catalina
    2. Bootstrap执行启动逻辑
      1. Catalina.setAwait
      2. Catalina.load,该方法会通过解析conf/server.xml下的配置,初始化Server对象
        1. initDirs,初始化一个临时目录
        2. initNaming,设置命名服务相关的几个环境变量
        3. createStartDigester,创建一个Digester用来解析server.xml,解析过程中会完成Server的装配工作,Digester原理可以参考http://commons.apache.org/proper/commons-digester/
        4. 加载server.xml并使用Digester解析,解析完成意味着Catalina下的server对象被初始化完成
        5. 将System.out和System.err重定向到ystemLogHandler类
        6. server.init,其init会逐层触发子元素的init方法,server.init->service.init->engine/connector.init等等
      3. Catalina.start,调用server.start
        1. 启动NamingContext并将所有JNDI引用绑定到其中
        2. 逐层触发子元素的start方法server.start->service.start->engine/connector.start等等
      4. StandardHost.start(StandardHost作为Engine的child,由engine触发其start方法)
        1. 将ErrorReportValve添加到pipeline中
        2. 配置StandardHostValve
        3. 启动HostConfig组件,这一步并不是显示调用,而是使用了事件机制,HostConfig监听lifecycleEvent事件
          1. 收到Lifecycle.START_EVENT事件时开始deployApps
            1.  (以webapps这种方式部署应用为例)扫描webapps下目录,解析目录文件,将其封装为StandardContext对象
            2. StandardContext.start
            3. 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-启动过程概览的更多相关文章

  1. mybatis源码分析:启动过程

    mybatis在开发中作为一个ORM框架使用的比较多,所谓ORM指的是Object Relation Mapping,直译过来就是对象关系映射,这个映射指的是java中的对象和数据库中的记录的映射,也 ...

  2. Nimbus<三>Storm源码分析--Nimbus启动过程

    Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype="-serv ...

  3. workerman源码分析之启动过程

    PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了 ...

  4. tomcat源码之connector启动过程

    connector源码部分 构造函数 生命周期启动 启动endPoint 启动accepter 线程执行方法 SocketProcessor启动

  5. elasticSearch6源码分析(1)启动过程

    1.找到bin目录,下面有elasticSearch的sh文件,查看执行过程 exec \ "$JAVA" \ $ES_JAVA_OPTS \ -Des.path.home=&qu ...

  6. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

  7. [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...

  8. Tomcat源码分析——启动与停止服务

    前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...

  9. v87.01 鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main () | 百篇博客分析 OpenHarmony 源码

    本篇关键词:内核重定位.MMU.SVC栈.热启动.内核映射表 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 鸿蒙内核源码分析(汇编基础) | ...

随机推荐

  1. python有关汉字编码问题

    python分为:程序编码(python安装程序).文件编码. 查看程序编码方式:sys.getdefaultencoding() 查看文件编码方式:1.import  chardet  2. f = ...

  2. 查询优化基础知识 - chendh blog

    概述 处理一个给定的查询,尤其是复杂查询,通常会有许多种策略,查询优化就是从这许多策略中找出最有效的查询执行计划的处理过程. 查询执行计划的步骤 产生逻辑上与给定表达式等价的表达式: 估计每个执行计划 ...

  3. 15.uboot study 串口初始化

    3. 串口初始化 4. 代码实现 关于串口 对于嵌入式设备的开发,刚开始好多设备都无法使用,由于无法获得程序的运行状态,调试程序需要花费好多时间和精力,因此串口对于嵌入式程序的调试的作用显而易见,当串 ...

  4. 成为数据专家,你只差一个Quick Insights的距离

    身处如今的大数据时代,你真的知道如何处理数据和分析数据吗?或许那些被你忽视的数据背后就暗藏着重要的商业灵感.并非人人都是数据专家,有时候你需要一些专业的软件来帮你处理数据.那么如何能快速.准确地从数据 ...

  5. jQuery学习笔记二

    事件监听者是DOM的一部分,任何页面都可以增加事件监听者.浏览器利用事件监听者监视页面上做了什么,然后告诉Javascript解释器是否需要采取行动.如:$('#showMessage').click ...

  6. Html学习笔记(二) 简单标签

    标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...

  7. 量化投资学习笔记29——《Python机器学习应用》课程笔记03

    聚类的实际应用,图像分割. 利用图像的特征将图像分割为多个不相重叠的区域. 常用的方法有阈值分割,边缘分割,直方图法,特定理论(基于聚类,小波分析等). 实例:利用k-means聚类算法对图像像素点颜 ...

  8. firewalls 开放端口

    # 1. 开放 tcp 80 端口 firewall-cmd --zone=public --add-port=10080/tcp --permanent # 2. 开放 10080 ~ 65535 ...

  9. Murata村田研发向左,制造向右

    前言:Murata村田自1944 年在日本京都创立,是陶瓷无源电子元件.无线连接模块和电源转换技术产品设计和制造领域的全球领导者. Murata 一直在为社会的进步和电子行业的革命贡献自己的力量. 在 ...

  10. spring——AOP原理及源码(二)

    回顾: 在上一篇中,我们提到@EnableAspectJAutoProxy注解给容器中加入了一个关键组件internalAutoProxyCreator的BeanDefinition,实际类型为 An ...