1. 程式人生 > 其它 >Tomcat 組成與工作原理

Tomcat 組成與工作原理

開源的 Java Web 應用伺服器,實現了 Java EE(Java Platform Enterprise Edition)的部分技術規範,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。Java EE 是 Sun 公 司為企業級應用推出的標準平臺,定義了一系列用於企業級開發的技術規範,除了上述的之外,還有 EJB、Java Mail、JPA、JTA、JMS 等,而這些都依賴具體容器的實現。

Servlet 容器:

Tomcat 組成如下圖:主要有 Container 和 Connector 以及相關元件構成

Server:指的就是整個 Tomcat 服 務器,包含多組服務,負責管理和 啟動各個 Service,同時監聽 8005 埠發過來的 shutdown 命令,用於關閉整個容器;

Service:Tomcat 封裝的、對外提供完整的、基於元件的 Web 服務, 包含 Connectors、Container 兩個核心元件,以及多個功能元件,各個 Service 之間是獨立的,但是共享 同一 JVM 的資源;

Connector:Tomcat 與外部世界的聯結器,監聽固定埠接收外部請求,傳遞給 Container,並將 Container 處理的結果返回給外部;

Container:Catalina,Servlet 容器,內部有多層容器組成,用於管理 Servlet 生命週期,呼叫 servlet 相關方法;

Loader:封裝了 Java ClassLoader,用於 Container 載入類檔案;

Realm:Tomcat 中為 Web 應用程式提供訪問認證和角色管理的機制;

JMX:Java SE 中定義技術規範,是一個為應用程式、裝置、系統等植入管理功能的框架,通過 JMX 可以遠端監控 Tomcat 的執行狀態;

Jasper:Tomcat 的 JSP 解析引擎,用於將 JSP 轉換成 Java 檔案,並編譯成 class 檔案。

Session:負責管理和建立 Session,以及 Session 的持久化(可自定義),支援 Session 的集 群。

Pipeline:在容器中充當管道的作用,管道中可以設定各種 valve(閥門),請求和響應在經由管道中各個閥門處理,提供了一種靈活可配置的處理請求和響應的機制。

Naming:命名服務,JNDI, Java 命名和目錄介面,是一組在 Java 應用中訪問命名和目錄服務的 API。命名服務將名稱和物件聯絡起來,使得我們可以用名稱訪問物件,目錄服務也是一種命名 服務,物件不但有名稱,還有屬性。Tomcat 中可以使用 JNDI 定義資料來源、配置資訊,用於開發與部署的分離

Container 組成

  • Engine:Servlet 的頂層容器,包含一 個或多個 Host 子容器;

  • Host:虛擬主機,負責 Web 應用的部 署和 Context 的建立;

  • Context:Web 應用上下文,包含多個 Wrapper,負責 Web 配置的解析、管 理所有的 Web 資源;

  • Wrapper:最底層的容器,是對 Servlet 的封裝,負責 Servlet 例項的創 建、執行和銷燬。

生命週期管理
Tomcat 為了方便管理元件和容器的生命週期,定義了從建立、啟動、到停止、銷燬共 12 中狀態,Tomcat 生命週期管理了內部狀態變化的規則控制,元件和容器只需實現相應的生命週期 方法即可完成各生命週期內的操作(initInternal、startInternal、stopInternal、 destroyInternal)

生命週期狀態===》New->Initializing->Initalized->StartingPrep->Starting->Started->StopPrep->Stopping->Stoped->Destroying->Destroyed->Failed

比如執行初始化操作時,會判斷當前狀態是否 New,如果不是,則丟擲生命週期異常;如果是,則設定當前狀態為 Initializing,並執行 initInternal 方法,由子類實現,方法執行成功則設定當 前狀態為 Initialized,執行失敗則設定為 Failed 狀態。

Tomcat 的生命週期管理引入了事件機制,在元件或容器的生命週期狀態發生變化時會通知事件監聽器,監聽器通過判斷事件的型別來進行相應的操作。事件監聽器的新增可以在 server.xml 檔案中進行配置。

Tomcat 各類容器的配置過程就是通過新增 listener 的方式來進行的,從而達到配置邏輯與容器的解耦。如 EngineConfig、HostConfig、ContextConfig。

    • EngineConfig:主要列印啟動和停止日誌

    • HostConfig:主要處理部署應用,解析應用 META-INF/context.xml 並建立應用的 Context

    • ContextConfig:主要解析併合並 web.xml,掃描應用的各類 Eeb 資源(filter、servlet、listener)

    • Tomcat 的啟動過程
    • Servlet 生命週期
    • Servlet 是用 Java 編寫的伺服器端程式。其主要功能在於互動式地瀏覽和修改資料,生成動態 Web 內容。

        1. 請求到達 server 端,server 根據 url 對映到相應的 Servlet

        2. 判斷 Servlet 例項是否存在,不存在則載入和例項化 Servlet 並呼叫 init 方法

        3. Server 分別建立 Request 和 Response 物件,呼叫 Servlet 例項的 service 方法(service 方法內部會根據 http 請求方法型別呼叫相應的 doXXX 方法)

        4. doXXX 方法內為業務邏輯實現,從 Request 物件獲取請求引數,處理完畢之後將結果通過 response 物件返回給呼叫方

        5. 當 Server 不再需要 Servlet 時(一般當 Server 關閉時),Server 呼叫 Servlet 的 destroy() 方法。

load on startup
當值為 0 或者大於 0 時,表示容器在應用啟動時就載入這個 servlet;當是一個負數或者沒有指定時,則指示容器在該 servlet 被選擇時才載入;正數的值越小,啟動該 servlet 的優先順序越高。