zoukankan      html  css  js  c++  java
  • 【Tomcat源码学习】2.容器管理

          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-8081/conf/logging.properties 
      -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
      -Xms512m 
      -Xmx1024m 
      -Djava.endorsed.dirs=/usr/local/tomcat-bs-xfb-wx-8081/endorsed 
      -classpath /usr/local/tomcat-bs-xfb-wx-8081/bin/bootstrap.jar:/usr/local/tomcat-bs-xfb-wx-8081/bin/tomcat-juli.jar 
      -Dcatalina.base=/usr/local/tomcat-bs-xfb-wx-8081 
      -Dcatalina.home=/usr/local/tomcat-bs-xfb-wx-8081 
      -Djava.io.tmpdir=/usr/local/tomcat-bs-xfb-wx-8081/temp
      -Dcom.sun.management.jmxremote= 
      -Dcom.sun.management.jmxremote.port=1099 
      -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子容器进行应用加载,具体加载会在下一章节进行讲解





  • 相关阅读:
    uniapp 微信小程序
    vue3获取当前路由
    常用网址
    (转)maven引入本地jar包的方法
    转:maven打包加时间戳方法总结
    Vue封装一个仿淘宝分页组件
    使用GitHub Actions自动构建DockerHub镜像
    luminati代理快速使用教程
    Redis Cluster 部署、在线扩容、缩容、迁移、集群管理实践
    Docker安装RabbitMQ以及无权限访问 vhost '/' 的解决方法
  • 原文地址:https://www.cnblogs.com/hframe/p/5318278.html
Copyright © 2011-2022 走看看