导读: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标准库:ftplib模块

    ftplib模块包含了文件传输协议(FTP)客户端的实现. 下面的例子展示了如何登入和获取进入目录的列表,dir函数传入一个回调函数,该回调函数在服务器相应时每一行调用一次.ftplib模块默认的回调 ...

  2. Ionic3学习笔记(十)实现夜间模式功能

    本文为原创文章,转载请标明出处 目录 创建主题样式 导入 variables.scss 创建 provider 创建 page 在 App 入口处应用主题 效果图 1. 创建主题样式 在 ./src/ ...

  3. Unknown: o pen_basedir restriction in effect. File(XXX) is not within the allo wed path(s): (XXX:/tmp/:/proc/) in Unknown on line 0报错解决

    报错: [error] 12321#0: *92386 FastCGI sent in stderr: "PHP message: PHP Warning: Unknown: open_ba ...

  4. python中字符串操作--截取,查找,替换

    python中,对字符串的操作是最常见的,python对字符串操作有自己特殊的处理方式. 字符串的截取 python中对于字符串的索引是比较特别的,来感受一下: s = '123456789' #截取 ...

  5. Mac 安装Android Studio 及环境变量配置

    我翻开历史一查,这历史没有年代.歪歪斜斜的每页上都写着"仁义道德"几个字,我横竖睡不着,仔细看了半夜,才从字缝里看出来,满本上都写着两个字"吃人"! –鲁迅&l ...

  6. linux中nginx、mysql安装碰到的问题

    服务器到期新买了一台服务器,记录一下重新安装基本环境碰到了一些问题 安装nginx 1. 启动失败 403 forbidden nginx 解决方案:(个人使用直接用了root账号,修改对应nginx ...

  7. Ftp Centos · GitBook

    これよくない pyftpdlibをつかおう sudo easy_install pyftpdlib nohup python -m pyftpdlib > pyftpdlib.log 2> ...

  8. 爬虫(二)requests 登陆某检索网站

    1 import requests import os from PIL import Image import pytesseract import re rootUrl = xxx # 构建登录页 ...

  9. iOS技术提升方向

    技术维度: 认知维度:

  10. 30分钟学会Objective-C

    注: 本文首发于我的个人博客:https://evilpan.com/2019/04/05/objc-basics/ 请原谅我的标题党.但是如果你有其他语言的学习经验,要学习Objective-C的语 ...