导读: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

最新文章

  1. centos 6.X minimal 系列最小化安装完成后,安装mono和jexus过程小记录
  2. jQuery Mobile Datepicker 使用
  3. Android源码剖析之Framework层实战版(Ams管理Activity启动)
  4. 设置apt-get
  5. 封装获取网络信息Linux—API类
  6. Java内存回收(垃圾回收)机制总结
  7. Spring Cloud在国内中小型公司能用起来吗?
  8. c#下winform的ftp上传
  9. Centos扩容swap分区
  10. java HttpClient 忽略证书的信任的实现 MySSLProtocolSocketFactory
  11. Pixel Recurrent Neural Networks翻译
  12. 剑指offer 二叉树中和为某一个值的路径
  13. PyCharm安装使用 激活码
  14. Android的系统属性:build.propSystemProperties
  15. 关于CPU CACHE工作机制的学习
  16. Linux上web服务器搭建
  17. Flink 的datastreamAPI 以及function函数的调用,性能调优
  18. jexl2 执行字符串Java代码
  19. vue:在router里面给页面加title
  20. 2018.10.27 bzoj3209: 花神的数论题(数位dp)

热门文章

  1. <NOIP2005提高T2>过河の思路
  2. Pygame相关
  3. ado.net DataSet
  4. 得亏了它,我才把潜藏那么深的Bug挖出来
  5. App崩溃监控
  6. Dubbo中@Service工作过程解析
  7. Java基础--冒泡排序算法
  8. 关于使用layui中的tree的一个坑
  9. 20 本地SQL查询
  10. Spring、SpringMVC、SpringBoot、SpringCloud的区别和联系