乱世王者8天150万 | 財經 | 資源 | 理財 | 考研 | 職場 | 論文 | 資格 | 股票學院 |

股票學院: 股票入門 - 股票知識 - 股票術語 - 炒股技巧 - 選股技巧 - 跟莊技巧 - 炒股經驗 - 投資策略 - K線圖 - 均線 - 分時圖 - 成交量 - 波浪理論 - 基本面分析 - 心理分析 - 漲停研究 - 趨勢線 - 江恩理論 - MACD - KDJ - 技術指標 - 財經股票書籍在線閱讀 - 金融類書籍下載 - 銀行學院 - 保險學院 - 外匯學院 - 債券學院 - 股票學院 - 基金學院 - 港股學院 - 黃金學院

當前位置:乱世王者8天150万 > 金融云 > 文章正文

乱世王者怎么隐藏贵族:深入Tomcat 架構及啟動過程「含部署」

時間:2019-05-27 16:17:22來源:今日頭條作者:佚名

    乱世王者8天150万 www.bubvk.icu 這個題目命的其實是很大的,寫的時候還是很忐忑的,但我盡可能把這個過程描述清楚。因為這是讀過源碼以后寫的總結,在寫的過程中可能會忽略一些前提條件,如果有哪些比較突兀就出現,或不好理解的地方可以給我提 Issue,我會盡快補充修訂相關內容。

    很多東西在時序圖中體現的已經非常清楚了,沒有必要再一步一步的作介紹,所以本文以圖為主,然后對部分內容加以簡單解釋。

    繪制圖形使用的工具是 PlantUML + Visual Studio Code + PlantUML Extension

    深入Tomcat 架構及啟動過程「含部署」

    圖形 PlantUML 源文件:

    • tomcat-architecture.pu
    • tomcat-init.pu
    • tomcat-start.pu
    • tomcat-context-start.pu
    • tomcat-background-thread.pu

    本文對 Tomcat 的介紹以 Tomcat-9.0.0.M22 為標準。

    Tomcat-9.0.0.M22 是 Tomcat 目前最新的版本,但尚未發布,它實現了 Servlet4.0 及 JSP2.3 并提供了很多新特性,需要 1.8 及以上的 JDK 支持等等,詳情請查閱 Tomcat-9.0-doc

    Tomcat-9.0-dochttps://tomcat.apache.org/tomcat-9.0-doc/index.html

    Overview

    深入Tomcat 架構及啟動過程「含部署」
    1. Bootstrap 作為 Tomcat 對外界的啟動類,在 $CATALINA_BASE/bin 目錄下,它通過反射創建 Catalina 的實例并對其進行初始化及啟動。
    2. Catalina 解析 $CATALINA_BASE/conf/server.xml 文件并創建 StandardServer、StandardService、StandardEngine、StandardHost 等
    3. StandardServer 代表的是整個 Servlet 容器,他包含一個或多個 StandardService
    4. StandardService 包含一個或多個 Connector,和一個 Engine,Connector 和 Engine 都是在解析 conf/server.xml 文件時創建的,Engine 在 Tomcat 的標準實現是 StandardEngine
    5. MapperListener 實現了 LifecycleListener 和 ContainerListener 接口用于監聽容器事件和生命周期事件。該監聽器實例監聽所有的容器,包括 StandardEngine、StandardHost、StandardContext、StandardWrapper,當容器有變動時,注冊容器到 Mapper。
    6. Mapper 維護了 URL 到容器的映射關系。當請求到來時會根據 Mapper 中的映射信息決定將請求映射到哪一個 Host、Context、Wrapper。
    7. Http11NioProtocol 用于處理 HTTP/1.1 的請求
    8. NioEndpoint 是連接的端點,在請求處理流程中該類是核心類,會重點介紹。
    9. CoyoteAdapter 用于將請求從 Connctor 交給 Container 處理。使 Connctor 和 Container 解耦。
    10. StandardEngine 代表的是 Servlet 引擎,用于處理 Connector 接受的 Request。包含一個或多個 Host(虛擬主機), Host 的標準實現是 StandardHost。
    11. StandardHost 代表的是虛擬主機,用于部署該虛擬主機上的應用程序。通常包含多個 Context (Context 在 Tomcat 中代表應用程序)。Context 在 Tomcat 中的標準實現是 StandardContext。
    12. StandardContext 代表一個獨立的應用程序,通常包含多個 Wrapper,一個 Wrapper 容器封裝了一個 Servlet,Wrapper的標準實現是 StandardWrapper。
    13. StandardPipeline 組件代表一個流水線,與 Valve(閥)結合,用于處理請求。 StandardPipeline 中含有多個 Valve, 當需要處理請求時,會逐一調用 Valve 的 invoke 方法對 Request 和 Response 進行處理。特別的,其中有一個特殊的 Valve 叫 basicValve,每一個標準容器都有一個指定的 BasicValve,他們做的是最核心的工作。
    • StandardEngine 的是 StandardEngineValve,他用來將 Request 映射到指定的 Host;
    • StandardHost 的是 StandardHostValve, 他用來將 Request 映射到指定的 Context;
    • StandardContext 的是 StandardContextValve,它用來將 Request 映射到指定的 Wrapper;
    • StandardWrapper 的是 StandardWrapperValve,他用來加載 Rquest 所指定的 Servlet,并調用 Servlet 的 Service 方法。

    Tomcat init

    深入Tomcat 架構及啟動過程「含部署」
    • 當通過 ./startup.sh 腳本或直接通過 java 命令來啟動 Bootstrap 時,Tomcat 的啟動過程就正式開始了,啟動的入口點就是 Bootstrap 類的 main 方法。
    • 啟動的過程分為兩步,分別是 init 和 start,本節主要介紹 init;
    • 初始化類加載器。[關于 Tomcat 類加載機制,可以參考我之前寫的一片文章:談談Java類加載機制]
    1. 通過從 CatalinaProperties 類中獲取 common.loader 等屬性,獲得類加載器的掃描倉庫。CatalinaProperties 類在的靜態塊中調用了 loadProperties() 方法,從 conf/catalina.properties 文件中加載了屬性.(即在類創建的時候屬性就已經加載好了)。
    2. 通過 ClassLoaderFactory 創建 URLClassLoader 的實例
    • 通過反射創建 Catalina 的實例并設置 parentClassLoader
    • setAwait(true)。設置 Catalina 的 await 屬性為 true。在 Start 階段尾部,若該屬性為 true,Tomcat 會在 main 線程中監聽 SHUTDOWN 命令,默認端口是 8005.當收到該命令后執行 Catalina 的 stop() 方法關閉 Tomcat 服務器。
    • createStartDigester()。Catalina 的該方法用于創建一個 Digester 實例,并添加解析 conf/server.xml 的 RuleSet。Digester 原本是 Apache 的一個開源項目,專門解析 XML 文件的,但我看 Tomcat-9.0.0.M22 中直接將這些類整合到 Tomcat 內部了,而不是引入 jar 文件。Digester 工具的原理不在本文的介紹范圍,有興趣的話可以參考 The Digester Component – Apache 或 《How Tomcat works》- Digester [推薦] 一章
    • parse() 方法就是 Digester 處理 conf/server.xml 創建各個組件的過程。值的一提的是這些組件都是使用反射的方式來創建的。特別的,在創建 Digester 的時候,添加了一些特別的 rule Set,用于創建一些十分核心的組件,這些組件在 conf/server.xml 中沒有但是其作用都比較大,這里做下簡單介紹,當 Start 時用到了再詳細說明:
    1. EngineConfig。LifecycleListener 的實現類,觸發 Engine 的生命周期事件后調用,這個監聽器沒有特別大的作用,就是打印一下日志
    2. HostConfig。LifecycleListener 的實現類,觸發 Host 的生命周期事件后調用。這個監聽器的作用就是部署應用程序,這包括 conf/// 目錄下所有的 Context xml 文件 和 webapps 目錄下的應用程序,不管是 war 文件還是已解壓的目錄。 另外后臺進程對應用程序的熱部署也是由該監聽器負責的。
    3. ContextConfig。LifecycleListener 的實現類,觸發 Context 的生命周期事件時調用。這個監聽器的作用是配置應用程序,它會讀取并合并 conf/web.xml 和 應用程序的 web.xml,分析 /WEB-INF/classes/ 和 /WEB-INF/lib/*.jar中的 Class 文件的注解,將其中所有的 Servlet、ServletMapping、Filter、FilterMapping、Listener 都配置到 StandardContext 中,以備后期使用。當然了 web.xml 中還有一些其他的應用程序參數,最后都會一并配置到 StandardContext 中。
    • reconfigureStartStopExecutor() 用于重新配置啟動和停止子容器的 Executor。默認是 1 個線程。我們可以配置 conf/server.xml 中 Engine 的 startStopThreads,來指定用于啟動和停止子容器的線程數量,如果配置 0 的話會使用 Runtime.getRuntime().availableProcessors() 作為線程數,若配置為負數的話會使用 Runtime.getRuntime().availableProcessors() + 配置值,若和小與 1 的話,使用 1 作為線程數。當線程數是 1 時,使用 InlineExecutorService 它直接使用當前線程來執行啟動停止操作,否則使用 ThreadPoolExecutor 來執行,其最大線程數為我們配置的值。
    • 需要注意的是 Host 的 init 操作是在 Start 階段來做的, StardardHost 創建好后其 state 屬性的默認值是 LifecycleState.NEW,所以在其調用 startInternal() 之前會進行一次初始化。

    相關閱讀

    焦點圖文

    關于我們 | 廣告服務 | 商務合作 | 網站地圖

    版權所有 Copyright(C)2018-2020 蘇州騏云躍網絡科技有限公司,未經授權禁止復制或建立鏡像,否則將依法追究法律責任!
    聲明:我們不做任何形式的代客理財及投資指導,凡是以天下金融網名義做股票推薦的行為均屬違法!
    廣告商的言論與行為均與天下金融網無關!股市有風險,投資需謹慎。
    蘇公網安備 32050502000166號
    蘇ICP備14018528號
    商務合作:乱世王者8天150万

    天下金融網版權所有