1. 程式人生 > >Tomcat體系結構與執行流程

Tomcat體系結構與執行流程

  • Server(伺服器)是Tomcat構成的頂級構成元素,所有一切均包含在Server中,Server的實現類StandardServer可以包含一個到多個Services;還可以包含一個GlobalNamingResources。
  • 次頂級元素Service的實現類為StandardService呼叫了容器(Container)介面,其實是呼叫了Servlet Engine(引擎),而且StandardService類中也指明瞭該Service歸屬的Server;Service中可以含有一個或多個Connector,但只能含有一個Engine。這使得不同的Connector可以共享同一個Engine。同一個Server中的多個Service之間沒有相關性。
  • Engine負責接收和處理來自它所屬的Service中的所有Connector的請求。

  • Host表示一個虛擬主機,並和一個伺服器的網路名關聯。注意Engine中必須有一個Host的名字和Engine的defaultHost屬性匹配。
  • 聯結器(Connector)將Service和Container連線起來,Connector負責接收來自客戶端(Client)的請求轉發到Container(容器)。比較常見的兩個是HTTP Connector和AJP Connector。 

  • Context表示在虛擬主機中執行的web應用程式。一個虛擬主機中能夠執行多個Context,它們通過各自的Context Path進行相互區分。如果Context Path為"",那麼該web應用為該虛擬主機的預設的web應用。

故我們從功能的角度將Tomcat原始碼分成5個子模組,它們分別是:

  1. Jsper子模組:這個子模組負責jsp頁面的解析、jsp屬性的驗證,同時也負責將jsp頁面動態轉換為java程式碼並編譯成class檔案。在Tomcat原始碼中,凡是屬於org.apache.jasper包及其子包中的原始碼都屬於這個子模組;
  2. Servlet和Jsp規範的實現模組:這個子模組的原始碼屬於javax.servlet包及其子包,如我們非常熟悉的javax.servlet.Servlet介面、javax.servet.http.HttpServlet類及javax.servlet.jsp.HttpJspPage就位於這個子模組中;
  3. Catalina子模組:這個子模組包含了所有以org.apache.catalina開頭的java原始碼。該子模組的任務是規範了Tomcat的總體架構,定義了Server、Service、Host、Connector、Context、Session及Cluster等關鍵元件及這些元件的實現,這個子模組大量運用了Composite設計模式。同時也規範了Catalina的啟動及停止等事件的執行流程。從程式碼閱讀的角度看,這個子模組應該是我們閱讀和學習的重點。
  4. Connectors子模組:如果說上面三個子模組實現了Tomcat應用伺服器的話,那麼這個子模組就是Web伺服器的實現。所謂聯結器(Connector)就是一個連線客戶和應用伺服器的橋樑,它接收使用者的請求,並把使用者請求包裝成標準的Http請求(包含協議名稱,請求頭Head,請求方法是Get還是Post等等)。同時,這個子模組還按照標準的Http協議,負責給客戶端傳送響應頁面,比如在請求頁面未發現時,connector就會給客戶端瀏覽器傳送標準的Http 404錯誤響應頁面。
  5. Resource子模組:這個子模組包含一些資原始檔,如Server.xml及Web.xml配置檔案。嚴格說來,這個子模組不包含java原始碼,但是它還是Tomcat編譯執行所必需的。

 Tomcat執行流程

  1. 請求被髮送到本機埠8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得
  2. Connector把該請求交給它所在的Service的Engine來處理,並等待Engine的迴應
  3. Engine獲得請求localhost:8080/test/index.jsp,匹配它所有虛擬主機Host
  4. Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)
  5. localhost Host獲得請求/test/index.jsp,匹配它所擁有的所有Context
  6. Host匹配到路徑為/test的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
  7. path="/test"的Context獲得請求/index.jsp,在它的mapping table中尋找對應的servlet
  8. Context匹配到URL PATTERN為*.jsp的servlet,對應於JspServlet類
  9. 構造HttpServletRequest物件和HttpServletResponse物件,作為引數呼叫JspServlet的doGet或doPost方法
  10. Context把執行完了之後的HttpServletResponse物件返回給Host
  11. Host把HttpServletResponse物件返回給Engine
  12. Engine把HttpServletResponse物件返回給Connector
  13. Connector把HttpServletResponse物件返回給客戶browser