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. JavaScript设计模式之构造器、模块和原型

    JavaScript面向对象 JavaScript是一种无类语言,但可以使用函数来模拟,这就涉及到设计模式.模式是一种已经验证过的可复用的解决方案,可用于解决软件设计中遇到的常见的问题,通常将这些解决 ...

  2. js 各进制前缀 及 转换

    二进制前缀0b var a=0b11;//a=3 八进制前缀0 var a=011;//a=9 十进制不用前缀 十六进制前缀0x var a=0x11;//a=17 数字转各进制字符串用num.toS ...

  3. ACM 子串和

    子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3   描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...

  4. PHP命名空间的概念与使用

    命名空间在其它编程语言中其名称不尽相同,但其核心慨念都是自定义一个存储空间.避免类名重复系统无法判断该执行哪一个类或是哪一个函数. 举例说明下.我先创建test这个文件夹在其当前目录下再创建一个ind ...

  5. php简单分页

    <?php //详情联系QQ:1195989301 自己引用数据库类文件 $c = $db->get_one("select count(*) from `{$DT_PRE}br ...

  6. Servlet 3.0/3.1 中的异步处理

    在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如访问数据库.调 ...

  7. SEO-站内优化规范

    类别 要求 实际工作要求 程 序 设 计 1.DIV+CSS布局 2.站内导航连接性良好 面包屑导航,翻页方式使用样式二,文章和产品上一页和下一页 3.图片的ALT属性 在编程时注意写 4.超级链接的 ...

  8. nginx反向代理与负载均衡

    一:nginx反向代理与负载均衡配置思路与用法 1.nginx反向代理:就是你去相亲时,媒婆就是这里的代理,让媒婆带你去见姑娘 2.nginx负载均衡:就是有很多的媒婆经过商量给你选出最适合你的姑娘, ...

  9. Google分析language垃圾信息

    最近一段时间,我在Google Analytics(以下简称GA)中查看网站数据时,发现一个非常可疑的信息: 这什么鬼? "language"这一项一般是 "zh-tw& ...

  10. mac环境下安装xampp

    首先下载XAMPP,然后配置虚拟域名hosts,再配置Apache服务, 配置Apache服务 1.打开/Applications/XAMPP/xamppfiles/etc/httpd.conf文件, ...