Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分。

 
一、Tomcat整体结构:
  • Server:即一个Tomcat服务器
  • Service:即一个Server对外提供的服务单元,一个Server下面可以有多个Service组件,一般只有一个
  • Connector:连接器,用于服务组件对外的访问器,一个服务组件可以有多个Connector子组件,不同Connector对应不同协议访问
  • Engine:引擎,是服务组件提供服务的核心组件,一个Service下有且仅有一个Engiine
  • Host:虚拟主机,用于定位服务访问的范围域,一个引擎下可以有多个虚拟主机,即除localhost外还可以是其他,另外虚拟主机还可以存在别名
  • Context:上下文,一个Host下可有存在多个独立的上下文,而一个上下文对应着我们发布的一个完整的应用
  • Realm:用于定义容器内应用程序访问认证,位于Engine下,可以有多种实现,一般我们选择UserDatabaseRealm,该Realm读取conf/tomcat-users.xml中数据进行认证
  • Value:扩展组件,用于表明上级组件具有的扩展属性,一个组件可以有多个Value组件,比如org.apache.catalina.valves.AccessLogValve访问日志组件
  • GlobalNamingResource:全局命名资源,也是全局配置问题,供所有组件按需读取与使用
    tomcat容器核心类图如下:
       
   容器组件主要实现了容器接口(Container),继承抽象类ContainerBase。
   容器采用组合模式,容器可以有若干子容器组成,
   另外所有容器都存在管道,权限,负载等其他组件部分构成。
 
二、Tomcat启动过程详解:
    1)守护进程加载与执行
   
  • *.sh : Shell脚本进行Tomcat启动的一系列环境初始化操作以及参数初始化
  • 启动:tomcat启动程序Bootstrap,在启动时会带上*.sh执行后的参数,如下:
    /usr/bin/java
    -Djava.util.logging.config.file=/usr/local/tomcat-bs-xfb-wx-/conf/logging.properties
    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    -Xms512m
    -Xmx1024m
    -Djava.endorsed.dirs=/usr/local/tomcat-bs-xfb-wx-/endorsed
    -classpath /usr/local/tomcat-bs-xfb-wx-/bin/bootstrap.jar:/usr/local/tomcat-bs-xfb-wx-/bin/tomcat-juli.jar
    -Dcatalina.base=/usr/local/tomcat-bs-xfb-wx-
    -Dcatalina.home=/usr/local/tomcat-bs-xfb-wx-
    -Djava.io.tmpdir=/usr/local/tomcat-bs-xfb-wx-/temp
    -Dcom.sun.management.jmxremote=
    -Dcom.sun.management.jmxremote.port=
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Djava.rmi.server.hostname=127.0.0.1
    org.apache.catalina.startup.Bootstrap start
  • 类加载:然后Bootstrap进行通过配置的类加载器进行lib包下jar的类加载
  • 创建守护进程:创建Catalina守护进程,同时初始化类加载器,以及digester对象
  • 容器组件装载:通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
  • 容器组件初始化:调用Server组件init方法进行初始化,Server在初始化时通过责任链模式依次调用子组件进行init方法初始化
  • 容器组件启动:调用Server组件start方法进行启动,Server在启动时通过责任链模式依次调用子组件进行start方法启动
  • 容器组件停止:调用Server组件stop方法进行停止,Server在停止时通过责任链模式依次调用子组件进行stop方法停止
  2)容器组件装载
  容器在装载过程中,主要为对应的容器组件生成,以及通用处理监听器

  • 整体是通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
  • Service在装载过程默认新建一个MapperListener监听对象
  • Host在装载过程默认新建一个HostConfig监听对象
  • Context在装载过程新建一个ContextConfig监听对象

  3)容器组件初始化

  • 由于容器基本上都继承与抽象类LifecycleMBeanBase,因此在装载过程中都需要将这些对象视为Mbean注入JVM中
  • Service初始化时,调用MapperListener的初始化方法
  • Engine容器初始化时,会初始化startStopExecutor线程池,用户进程的监控的处理
 
 4)容器组件启动
  • Service启动时,调用MapperListener的启动方法
  • MapperListener启动时,将Engine及所有子容器注册该监听,同时将所有的host,context注入到该监听内容中,另外看Context下是否配置有Wapper描述信息,如果有构建WrapperMappingInfo,供后续生成Wrapper时使用
  • Engine启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Host子组件,执行监听
  • Host启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Context子组件,执行监听,其中会调用HostConfig进行应用程序读取,具体加载会在下一章节进行讲解。
  • 在通过HostConfig进行应用程序加载后,调用Context子容器进行应用加载,具体加载会在下一章节进行讲解。

【Tomcat源码学习】-2.容器管理的更多相关文章

  1. Tomcat源码学习(1)

    Tomcat源码学习(1) IntelliJ IDEA 17.3.3 导入 Tomcat 9.0.6源码 下载源码 tomcat_9.0.6 启动 IDEA. 点击 Open,选择刚才下载的文件解压后 ...

  2. Tomcat源码学习

    Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...

  3. 【Tomcat源码学习】-1.概述

    Tomcat是用java语言开发的一个Web服务器,最近花了差不多两周时间对Tomcat 9.0源码进行了一遍学习,由于知识储备有限,也只是理解了一个大概,下面就由我来给大家分享一下我对Tomcat的 ...

  4. Tomcat源码学习 - 环境搭建

    一. 源码下载 PS: 多图预警 在开始阅读源码之前,我们需要先构建一个环境,这样才能便于我们对源码进行调试,具体源码我们可以到官网进行下载(这里我以8.5.63版本为例). 二. 项目导入 下载并解 ...

  5. Tomcat源码学习记录--web服务器初步认识

    Tomcat作为开源的轻量级WEB服务器,虽然不是很适合某些大型项目,但是它开源,读其源代码可以很好的提高我们的编程功底和设计思维.Tomcat中用到了很多比较好的设计模式,其中代码风格也很值得我们去 ...

  6. TOMCAT源码分析——生命周期管理

    前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...

  7. Mybatis源码学习之事务管理(八)

    简述 在实际开发中,数据库事务的控制是一件非常重要的工作,本文将学习Mybatis对事务的管理机制.在Mybatis中基于接口 Transaction 将事务分为两种,一种是JdbcTransacti ...

  8. Tomcat源码学习一

    这段时间工作不太忙,所以抽时间学习了TOMCAT, TOMCAT实际就是负责保持TCP连接传递到部署的项目中.浏览器实质就是TCP发送器.将用户的请求封装成TCP发送请求.当然格式是双方协定的.使用的 ...

  9. 【Tomcat源码学习】-5.请求处理

    前四章节,主要对Tomcat启动过程中,容器加载.应用加载.连接器初始化进行了相关的原理和代码流程进行了学习.接下来开始进行接受网络请求后的相关处理学习.   一.整体流程      基于上一节图示进 ...

随机推荐

  1. <c>----<choose><when><otherwise>

    <c:choose> <c:when test="${username== '1' && password== '2'}"> <jsp ...

  2. mongoDB & Nodejs 访问mongoDB (一)

    最近的毕设需要用到mongoDB数据库,又把它拿出来再学一学,下盘并不是很稳,所以做一些笔记,不然又忘啦. 安装 mongoDB & mongoVUE mongoDB: https://www ...

  3. Servlet中过滤器的执行流程

  4. webots自学笔记(四)传感器API使用、查看官方文档

           原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,转载请注明原文章出处.           不能说webots的学习资料少,只能说 ...

  5. 理解云计算的(IaaS PaaS SaaS)

    本文不经允许,不得转载! 云计算技术已经慢慢普及了.我们做技术的有必要学习云计算技术. IaaS:Infrastructure-as-a-Service(基础设施即服务)云计算到来之前,很多企业都是自 ...

  6. 解决input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能

    最近做项目遇到: 背景:点击单元格,easyUI自动生成input可编辑框. 问题点:input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能 要实现需求: 1.回车键 ...

  7. 页面异步发送json数据封装controller方法形参 pojo中,使用@requestBody和不使用它页面的异步方式不同之处

    方式一: 使用@requestBody 方式二 : 直接封装到pojo的方式

  8. 实用 .htaccess 用法大全

    这里收集的是各种实用的 .htaccess 代码片段,你能想到的用法几乎全在这里. 免责声明: 虽然将这些代码片段直接拷贝到你的 .htaccess 文件里,绝大多数情况下都是好用的,但也有极个别情况 ...

  9. Eclipese Mars安装SVN的全步骤

    在做毕业设计的过程中,由于是团队项目,需要用到SVN,而全新的Eclipse Mars从官网下载下来没有SVN插件,需要自己下载. 1.选择Help-->Eclipese MarketPlace ...

  10. Vue.js 插件开发详解

    前言 随着 Vue.js 越来越火,Vue.js 的相关插件也在不断的被贡献出来,数不胜数.比如官方推荐的 vue-router.vuex 等,都是非常优秀的插件.但是我们更多的人还只停留在使用的阶段 ...