web伺服器專題:tomcat(一)基礎及模組

糖拌蕃茄發表於2020-12-03

Web伺服器專題:Tomcat(一)基礎及模組

針對java系的經典伺服器,打算系統的整理一下Tomcat的機制和一些原理,以此記錄。

插一則題外話,關於tomat這個名字的由來:Tomcat 名稱的由來

關於Tomcat

基礎的 tomcat 內容就不過多贅述了,基本的百度百科都可以看到,在這裡我想從catlina入手介紹一下tomcat,我想很多人剛開始接觸tomcat,不論是日誌裡,bin目錄下的指令碼里,都會看見catlina這個東西,都會很困惑,什麼是 Catlina,說到 Catlina,就要介紹一些tomcat相比於Apache 的不同之處,簡單來說,Apache主要用來處理網路中的靜態資源請求(HTML,CSS、圖片等),而tomcat是專為java的servlet而生的,簡單來說就是為J2EE提供環境的, 用來解析動態的資源處理(即後端的業務處理,動態資料等)的部分就被稱為 Catlina。

tomcat 繼承了Apache 作為web伺服器的基本功能,本身包含了三個重要的組成:

處理 html, js, css等 靜態頁面的Web容器;

根據不同的請求來呼叫不同的servlet的servlet容器Catlina;

編譯jsp的引擎Jasper

其實Catlina就是一個Servlet容器,它也是tomcat區別於其他伺服器的核心,整個Tomcat最核心的事就是進行Servlet的管理和根據前端的請求進行排程。

Tomcat的目錄層級及常用檔案

首先簡單記錄一下Tomcat的檔案目錄及一些常用的檔案。

Tomcat的目錄:

|---bin://存放啟動和關閉tomcat指令碼

  |---conf://存放不同的配置檔案(server.xml和web.xml);
  |---doc://存放Tomcat文件;
  |---lib/japser/common://存放Tomcat執行需要的庫檔案(JARS);
  |---logs://存放Tomcat執行時的LOG檔案;
  |---src://存放Tomcat的原始碼;
  |---webapps://Tomcat的主要Web釋出目錄(包括應用程式示例);
  |---work://存放jsp編譯後產生的class檔案;

以上目錄中,一般我們基本開發部署中常用的基本就  bin  、conf 、logs三個,其中 tomcat 的系統級啟動shell、bat檔案均在bin目錄下,具體環境變數及啟動流程,都可以在start.sh或start.bat中檢視原始碼,這裡就不多說了,就主要說一下 conf 目錄下的檔案吧:

server.xml: Tomcat的主配置檔案,包含Service, Connector, Engine, Realm, Valve, Hosts主元件的相關配置資訊;

     web.xml:遵循Servlet規範標準的配置檔案,用於配置servlet,併為所有的Web應用程式提供包括MIME對映等預設配置資訊;

tomcat-user.xml:Realm認證時用到的相關角色、使用者和密碼等資訊;Tomcat自帶的manager預設情況下會用到此檔案;在Tomcat中新增/刪除使用者,為使用者指定角色等將通過編輯此檔案實現;

     catalina.policy:Java相關的安全策略配置檔案,在系統資源級別上提供訪問控制的能力;

     catalina.properties:Tomcat內部package的定義及訪問相關控制,也包括對通過類裝載器裝載的內容的控制;Tomcat在啟動時會事先讀取此檔案的相關設定;

     logging.properties: Tomcat6通過自己內部實現的JAVA日誌記錄器來記錄操作相關的日誌,此檔案即為日誌記錄器相關的配置資訊,可以用來定義日誌記錄的  元件級別以及日誌檔案的存在位置等;

     context.xml所有host的預設配置資訊;

Tomcat架構

Tomcat的設計是基於模組化設計的,內部主要依賴於不同的模組元件構成, 這裡打算圖解一下Tomcat的內建元件及 一條請求的主要流程,話不多說,先上圖:

一句話簡單概括,一個tomcat只有一個Server作為根,它管理著多個Service服務,而Service服務又管理著多個Connector以及一個Container,其中核心元件為Connector以及Container

Server元件

從圖中可以看出,一個Tomcat只能有一個Server,Server就是一個Tomcat的例項。

Service元件

Service其實是一個集合,它將Connector元件與Container元件包裝組合在一起(一個Service可以有多個Connector和一個Container),對外進行服務,而Service又是執行在Server中,也就是說,一個Tomcat可以有多個service

Connector元件

 該元件主要負責監聽指定埠的客戶端請求(不同埠對應不同的Connect元件),將Socket請求過來的資料,都封裝成Request請求物件,同時將該請求物件 傳遞給Container容器進行下一步的處理。

Container元件

Container元件才是最接近Web應用的元件,它負責根據請求進行一系列的servlet呼叫,本身Container又包含四個子容器:EngineHostContextWrapper

Container的容器組合如下圖:

Engine :引擎,用來管理多個站點, 一個Service最多隻能有一個Engine
Host :代表一個站點,也可以叫虛擬主機,通過配置Host 就可以新增站點;
Context :代表一個應用程式,即為我們開發的一個war服務在webapp目錄下的各個應用,或者一個WEB-INF 目錄以及下面的web.xml 檔案;
Wrapper :每個Wrapper 封裝著一個servlet

一次完整的流程:

1、當我們瀏覽器點選事件發生,傳送了一個http/https的請求,首先到達tomcat,即執行的例項server中

2、該請求被監聽 8080 埠的 connector監聽到,獲取請求報文後,封裝成Request請求,並將該請求發往Engine

3、Engine根據請求的url,搜尋使用哪個Host

4、當相應的Host獲取該請求後,根據請求中的地址,找尋相應的Context來處理該請求

5、Context根據其內部的對映表,獲取相應的servlet,並構造HttpServletRequest物件和HttpServletResponse物件,進行業務處理

6、Context將處理完的HttpServletResponse物件返回給Host

7、Host再將結果返回Engine

8、Engine中心排程,將結果返回給 connector

9、connector將結果返歸給客戶端

相關文章