天天看點

Tomcat 學習進階曆程之Tomcat架構與核心類分析

前面的http及socket兩部分内容,主要是為了後面看Tomcat源碼而學習的一些網絡基礎。從這章開始,就開始實際深入到Tomcat的‘内在’去看一看。

在分析Tomcat的源碼之前,準備先看一下Tomcat的架構與一些核心類的簡單分析,并簡單介紹一下Tomcat是如何處理一次Http請求的。這部分内容有相當一部分來源于網絡,在此,感謝原作者的貢獻。

Tomcat的總體架構

Tomcat 學習進階曆程之Tomcat架構與核心類分析

Tomcat的架構關系可以從Tomcat的配置檔案server.xml中看到端倪。

從上圖中可以看出Tomcat 的心髒是兩個元件:Connector 和 Container,關于這兩個元件将在後面詳細介紹。Connector 元件是可以被替換,這樣可以提供給伺服器設計者更多的選擇,因為這個元件是如此重要,不僅跟伺服器的設計的本身,而且和不同的應用場景也十分相關,是以一個 Container 可以選擇對應多個 Connector。多個 Connector 和一個 Container 就形成了一個 Service,Service 的概念大家都很熟悉了,有了 Service 就可以對外提供服務了,但是

Service 還要一個生存的環境,必須要有人能夠給她生命、掌握其生死大權,那就非 Server 莫屬了。是以整個 Tomcat 的生命周期由 Server 控制。

Connector又叫連接配接器,它的主要任務是接收浏覽器發過來的Tcp連接配接請求(說白了就是上一章講的Socket請求),根據請求行,請求頭,請求正文資訊建立一個Request和Response(這個Request和Response我想大家都再熟悉不過了,雖然他還不是真正的HttpServletRequest與HttpServletResponse,但确實是有關的,姑且現在就當它是。這部分内容在後面的章節後講到)。然後會産生一個線程來處理這個請求并把産生的 Request 和 Response 對象傳給處理這個請求的線程,處理這個請求的線程就是

Container 元件要做的事了。

在一個Service中,Connector可以有多個,每一個Connector對應了一種不同的處理協定,在Tomcat中預設支援的是Http與AJP協定,是以Tomcat中實作了HttpConnector與AjpConnector。但是Container隻有一個。Connector與Container是多對一的關系。如下:

Tomcat 學習進階曆程之Tomcat架構與核心類分析

說白了,Service 隻是在 Connector 和 Container 外面多包一層,把它們組裝在一起,向外面提供服務,一個 Service 可以設定多個 Connector,但是隻能有一個 Container 容器。

2.  Tomcat處理一次請求的過程

Tomcat 學習進階曆程之Tomcat架構與核心類分析

上面的圖形簡單描繪了Tomcat解析一次請求的大緻過程。圖中隻簡單描繪了Tomcat處理的幾個重要節點,裡面包括對的很多其他元件,比如:processor,Engine,Host,Context等都沒有描繪出來,這些細節在後面的章節一邊學習一面總結。

在Container接收到Request後,根據Request中請求的URL,解析出要請求的Servlet,根據配置檔案(一般為應用中web.xml中的Servlet或其他可通路資源)獲得起路徑後,使用相應的類加載器加載Servlet,然後調用其Service方法。餘下的就是客戶自己編寫的Servlet進行工作了。

3、Tomcat核心類

Tomcat 學習進階曆程之Tomcat架構與核心類分析

Tomcat代碼看似很龐大,但從結構上看卻很清晰和簡單,它主要由一堆元件組成,如Server、Service、Connector等,并基于JMX管理這些元件,另外實作以上接口的元件也實作了代表生存期的接口Lifecycle,使其元件履行固定的生存期,在其整個生存期的過程中通過事件偵聽LifecycleEvent實作擴充。

Catalina:與開始/關閉shell腳本互動的主類,是以如果要研究啟動和關閉的過程,就從這個類開始看起。

Server:是整個Tomcat元件的容器,包含一個或多個Service。

Service:Service是包含Connector和Container的集合,Service用适當的Connector接收使用者的請求,再發給相應的Container來處理。

Connector:實作某一協定的連接配接器,如預設的有實作HTTP、HTTPS、AJP協定的。

Container:可以了解為處理某類型請求的容器,處理的方式一般為把處理請求的處理器包裝為Valve對象,并按一定順序放入類型為Pipeline的管道裡。Container有多種子類型:Engine、Host、Context和Wrapper,這幾種子類型Container依次包含,處理不同粒度的請求。另外Container裡包含一些基礎服務,如Loader、Manager和Realm。

Engine:Engine包含Host和Context,接到請求後仍給相應的Host在相應的Context裡處理。

Host:就是我們所了解的虛拟主機。

Context:就是我們所部屬的具體Web應用的上下文,每個請求都在是相應的上下文裡處理的。

Wrapper:Wrapper是針對每個Servlet的Container,每個Servlet都有相應的Wrapper來管理。

可以看出Server、Service、Connector、Container、Engine、Host、Context和Wrapper這些核心元件的作用範圍是逐層遞減,并逐層包含。

參考:

上一篇: