Tomcat结构简介

Tomcat结构简介

结构简图

Tomcat结构简介

概述

Tomcat中组件大致分为两个部分,一部分为用来处理请求(Server、Service、Connctor等),另一部分来定义内部的结构(Engine、Host、Context等)。

上图中Lifecycle以及Container框住的部分,都是自身的子接口。下文中的关键属性主要指的是与结构相关的属性。

说明

Catalina

  • 全类名

    org.apache.catalina.startup.Catalina

  • 意义

    此类一般用于与外部命令交互,提供Tomcat程序整体的启停操作。

  • 关键属性

    server(org.apache.catalina.Server)[1]:Catalina通过此属性与Tomcat服务器交互。

  • 关键方法

    load():解析Tomcat的server.xml并根据配置内容实例化各个部分对象,最终解析出一个Server接口实现类的实例。

    start()/stop():启动/停止Tomcat。

Lifecycle

  • 全类名

    org.apache.catalina.Lifecycle

  • 默认实现类

    org.apache.catalina.util.LifecycleBase

  • 意义

    Tomcat中大多数组件都间接的实现了此接口,此接口用于统一控制各个级别组件的声明周期,并提供了生命周期事件监听器。

    上图中Lifecycle框内的类都是间接实现此接口的接口、类。

    Tomcat中生命周期图可以查阅org.apache.catalina.Lifecycle接口的注释,这里需要补充的是这种结构充分利用了状态模式

  • 关键方法

    addLifecycleListener():添加生命周期监听事件。

    init():初始化方法

    start():启动方法

    stop():停止方法

    destroy():销毁方法

Server

  • 全类名

    org.apache.catalina.Server

  • 默认实现类

    org.apache.catalina.core.StandardServer

  • 意义

    可以理解为Tomcat服务器(Tomcat*组件)的抽象。我们常说的Tomcat服务器一般指的就是Server对象,且其实现类StandardServer为final类,不可继承。可以认为在Java代码方面,整个Tomcat在运行过程中就是一个StandardServer实例。

  • 关键属性

    services(org.apache.catalina.Service)[1..*]:一个服务器中包含有多个服务。

Service

  • 全类名

    org.apache.catalina.Service

  • 默认实现类

    org.apache.catalina.core.StandardService

  • 意义

    一个Tomcat服务器可以有多个Service,每个Service代表一个Tomcat服务,不是Web应用。每个Tomcat服务是对应一个Tomcat中的*容器(Engine),同时包含了一组Connector。

  • 关键属性

    container(org.apache.catalina.Container)[1]:指向服务自身对应的容器,一般为Engine,服务通过此属性调用对应容器以及容器子容器的生命周期方法或其他方法。

    connections(org.apache.catalina.connector.Connector)[1..*]:指向本服务提供的Socket端口,通过此属性调用连接实例。

Container

  • 全类名

    org.apache.catalina.Container

  • 默认实现类

    org.apache.catalina.core.ContainerBase,此类是Container接口的一级抽象类。

  • 意义

    Tomcat中的容器指的是可以处理客户端请求以及将响应返回给客户端的对象,任何容器内部都支持通过pipeline方式组织的Valve,来顺序配置请求。

  • 特殊说明

    Container相比Lifecycle,有自己的监听器,用于监听容器内部的事件,例如添加/删除Valve等。但是,容器启动和停止是生命周期事件

  • 关键属性

    children(java.util.HashMap)[1]:以容器名称-容器实例的方式存储当前容器的子容器。

    parent(org.apache.catalina.Container)[0..1]:当前容器的父容器,无父容器时为null。

    pipeline(org.apache.catalina.Pipeline)[1]:保存容器对应的Pipeline实例。

Engine

  • 全类名

    org.apache.catalina.Engine

  • 默认实现类

    org.apache.catalina.core.StandardEngine

  • 意义

    Engine一般为Tomcat容器结构中的*容器,其子容器一般为Host。Engine即提供Servlet服务的基础引擎。

  • 关键属性

    service(org.apache.catalina.Service)[0..1]:Engine对应的service。

Host

  • 全类名

    org.apache.catalina.Host

  • 默认实现类

    org.apache.catalina.core.StandardHost

  • 意义

    Host,即为在Tomcat中的一个虚拟的服务主机,其定义的appBase属性定义了此主机的根路径。其子容器一般为提供具体服务的Context。

Context

  • 全类名

    org.apache.catalina.Context

  • 默认实现类

    org.apache.catalina.core.StandardContext

  • 意义

    Context即为在开发具体web应用时直接相关的容器,每一个web应用都对应的一个Context实例。在Servlet中使用的到各种全局变量都是在Context中保存的,比如applicationListeners、ApplicationContext等。Context的子容器一般为Wrapper。

Wrapper

  • 全类名

    org.apache.catalina.Wrapper

  • 默认实现类

    org.apache.catalina.core.StandardWrapper

  • 意义

    每一个Wrapper内包含一个web.xml中定义的servlet,这个servlet可以是单例的(默认情况),也可以是通过实现SingleThreadModel接口作为原型。Wrapper提供对某一类型servlet的统一处理,包括init、destroy等。Wrapper是最d底层的容器,父容器一般为Context,无子容器。

  • 关键属性

    instance(javax.servlet.Servlet)[1]:Wrapper对应的Servlet接口实现类的实例。

Pipeline

  • 全类名

    org.apache.catalina.Pipeline

  • 默认实现类

    org.apache.catalina.core.StandardPipeline

  • 意义

    链表存储的Valve数据结构,里边保存了容器对相应的所有Valve。内部的Valve连接从头(first)开始执行直至最后(basic)一个Valve。

  • 关键属性

    basic(org.apache.catalina.Valve)[1]:最后执行的Valve,一般在容器构造方法时指定。

    first(org.apache.catalina.Valve)[1]:第一个执行的Valve,如果不存在则直接使用basic。

Valve

  • 全类名

    org.apache.catalina.Valve

  • 意义

    Valve与容器相关,可以处理传入容器的request和传出容器的resposne(比如记录日志、添加属性、检查某些信息等)。不要在Valve的invoke方法中修改request和response的关键属性。

Connector/ProtocolHandler/AbstractEndPoint

以上三个类中Connector和ProtocolHandler都是Tomcat内部的用于处理连接包coyote中的内容,而AbstractEndPoint是帮助类,用于帮助处理连接。详细内容请参见:Tomcat中的连接处理。