How Tomcat works — 2、tomcat启动(1)

主要介绍tomcat启动涉及到的一些接口和类。html

目录

  • 概述
  • tomcat包含的组件
  • server和service
  • Lifecycle
  • Container
  • Connector
  • 总结

概述

tomcat做为一个服务器,它的主要功能就是接收请求——处理请求——返回,若是是咱们本身实现一个最简单的服务器,启动一个线程监听某个端口,该端口有数据进来的话就接收数据,而后在启动一个线程去处理接收到的数据并返回。那么启动一个服务器最重要的就是启动一个线程监听某个端口,tomcat也是,只不过tomcat包含不少组件,首先要完成组件的初始化,而后再依次启动各个组件。因此要知道tomcat 的启动过程,首先了解下tomcat的组件。java

tomcat包含的组件

  • server和service:server用来启动和关闭服务器,包含服务器组件service,service包含其余组件
  • Lifecycle:管理整个tomcat的生命周期,包括start,stop。tomcat全部的组件都实现了该接口(或者继承了实现该接口的类)
  • Container:tomcat中最重要的部分,servlet的容器
  • Connector:tomcat的链接器,负责监听端口,接收请求并分发请求

其实还包括Processor、Session、Manager、Deployer等,可是在启动过程当中,这些不是最重要的,在了解了整个过程以后在进行具体学习。web

server和service

tomcat 提供了一种优雅的服务器启动和中止的方法,由server启动service组件,service启动全部包含的组件。service包含Container、Connector等组件。apache

Lifecycle

生命周期组件里面主要包含一个接口、一个类、一个enum:Lifecycle、LifecycleEvent、LifecycleState。api

Lifecycle接口

接口org.apache.catalina.Lifecycle包含如下定义:tomcat

  • 管理生命周期的基本方法,如:start,stop
  • 对于组件listener的管理
  • 组件生命周期内可能会触发的事件,如:START_EVENT,STOP_EVENT等,每个常量字符串对应一种LifecycleEvent

抽象类LifecycleBase实现了Lifecycle接口,主要提供了基本的start和stop实现,并增长了如下方法服务器

  • 关于事件的:fireLifecycleEvent(protect,能够被子类重载、使用),用来触发该组件的全部Listener
  • 关于初始化子组件的:initInternal(protect),startInternal(protect)等,由于在tomcat的许多组件都是父子关系(好比:Engine和Host),这也是tomcat生命周期管理优雅的地方:每一个组件负责启动本身的子组件或者相关组件(监听了该组件的某些事件START_EVENT等),因此tomcat只要启动最顶层的组件便可

抽象类LifecycleMBeanBase继承了LifecycleBase类,这个类实现了LifecycleBase的一些方法,提供了一些MBean的基本管理,tomcat提供了对JMX的支持。架构

LifecycleEvent类

org.apache.catalina.LifecycleEvent 继承自 java.util.EventObject ,表示lifecycle触发的事件,和事件紧密关联的就是listener了,全部想感知组件生命周期状态变化的类都要事先这个接口 (org.apache.catalina.LifecycleListener) 来监听对应的事件。事实上好比ContextConfig的初始化就是监听了Context的事件。app

LifecycleEnum

提供了lifecycle的变化的各类状态,参考下图(tomcat javadocwebapp

Container

其实tomcat做为servlet容器做重要的部分就是Container组件,Container组件是四层架构,类图以下:

简单介绍容器的四层架构:

  • Engine:在catalina容器架构中不是必要的,可是若是要使用必定是处于容器的最顶层,下面有一个或者多个Host(虚拟主机),engine负责将请求分发给对应的虚拟主机
  • Host:表示一个虚拟主机,下面有一个或者多个Context,Host负责将请求分发给对应的Context
  • Context:表示一个webapp,下面有一个或者多个Wrapper,负责将请求映射到对应的Wrapper
  • Wrapper:表示一个servlet,负责加载和初始化servlet

Connector

 

在刚开始咱们说过了,本身实现服务器的话就是监听一个端口,接收请求,这也是tomcat Connector组件的做用,最后监听端口是由JIoEndpoint的一个内部类Acceptor来完成的,因此当JIoEndpoint$Acceptor线程启动的时候,整个tomcat服务器也就启动完成了。

tomcat支持http和ajp协议,因此提供了Http11Protocol和AjpProtocol来处理对应的协议(上面主要画出了http协议的部分)。

总结

以上是tomcat启动所涉及到的主要类和接口,固然了其中涉及到的远不止于此,可是一开始我也说了对于不一样的目的,能够有针对性的学习,因此以上只关注了一些户主要的类。还有一个问题就是,我仍是有点纠结的:其实我以为记录的时候没有必要添加大段代码,由于这些代码都比较好懂,并且若是真要阅读的话能够随时找获得,固然了,对于一些非常重要或者经典的代码仍是颇有必要专门分析的。

在阅读的过程当中记了一些笔记和绘制了一些图(这些在tomcat源码阅读的最后再附上),可是感受都比较琐碎,通过这么一整理感受更加明晰了。

相关文章
相关标签/搜索