导读: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. webdriver访问各个浏览器驱动下载及安装

    这里首先需要查看一下自己安装的selenium版本 查看步骤: windows系统打开cmd命令行输入:pip show selenium查看结果如下: 进入到selenium官网查看版本信息 sel ...

  2. swift中的闭包总结

    闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的基本语法 闭包表达式语 ...

  3. Soulwail

    XMLHttpRequest 属性解读 首先在 Chrome console 下创建一个 XMLHttpRequest 实例对象 xhr.如下所示: inherit 试运行一下代码. var xhr ...

  4. SetTimeout()多次运行函数后越来越快的问题

    问题原因很简单,但是由于代码逻辑问题,一直没有考虑到: 网上有个帖子说的很明白:原帖入口 假如你在0时刻点击了一下按钮,那么500ms时数字会跳一下,1000ms会再跳一下,依次类推,1500,200 ...

  5. 5种方法获取url中文件的扩展名

    /** * strrchr - 查找指定字符在字符串中的最后一次出现 * strrpos — 计算指定字符串在目标字符串中最后一次出现的位置 * end — 将数组的内部指针指向最后一个单元 * pa ...

  6. Scheme实现数字电路仿真(3)——模块

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/12242650.html 作者:窗户 ...

  7. 热更新,App双开,App隐藏,App试用 -- Replugin的实际应用(原创)

    热更新,App双开,App隐藏,App试用 -- Replugin的实际应用(原创) RePlugin是Qihoo 360公司的开源框架,原本目的是用于热更新.但是,这个框架提供的功能远远超出了热更新 ...

  8. 一行python代码搞定文件分享

    给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...

  9. ef01

    1.ef简介 学习地址: https://www.entityframeworktutorial.net/ orm:Object relations mapping 对象关系映射 实体类中的属性与数据 ...

  10. 前端每日实战:111# 视频演示如何用纯 CSS 创作一只艺术的鸭子

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/aaoveW 可交互视频 此视频是可 ...