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中的連接處理。