Tomcat是Apache軟體基金會的一個頂級專案,由Apache、Sun和其它一些公司及個人共同開發,是目前比較流行的Web伺服器之一。Tomcat是一個開源的、小型的輕量級應用伺服器,具有佔用系統資源少、擴充套件性好、功能豐富等優點。雖然Tomcat是一個輕量級容器,但是其本身實現還比較複雜,包含很多模組,本文會對Tomcat的基本結構和各個模組進行簡單介紹。
Servlet容器概念
Servlet容器也叫做Servlet引擎,是Web伺服器或應用程式伺服器的一部分,用於在傳送的請求和響應之上提供網路服務,解碼基於 MIME的請求,格式化基於MIME的響應。Servlet沒有main方法,不能獨立執行,它必須被部署到Servlet容器中,由容器來例項化和呼叫 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命週期內包容和管理Servlet。在JSP技術 推出後,管理和執行Servlet/JSP的容器也稱為Web容器。
以下為Servlet介面的定義:
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
Tomcat結構概覽
Tomcat是一個成熟的Web伺服器,設計和開發都比較優雅,功能結構也是模組化的。Servlet容器應該有三個基本任務:建立Request物件、建立Response物件和Servlet處理請求響應,基於這三個任務Tomcat劃分出兩個核心模組:聯結器和容器。為了優雅的進行容器的生命週期管理,Tomcat又新增了伺服器元件模組。各個模組之間的關聯關係如下圖所示:
![Tomcat容器概覽]
伺服器元件Server
Server提供了Tomcat的生命週期管理的邏輯,它使用了一種優雅的方式來啟動/關閉整個系統,不需要再對聯結器和容器分別啟動/關閉。
當伺服器元件啟動的時候,它會啟動其中的所有的元件(聯結器和容器),然後就開始無限期的等待關閉命令。如果需要關閉系統,可以向指定埠傳送一條關閉命令,伺服器元件在收到關閉命令後,會關閉其中所有的元件。
服務元件Service
伺服器元件使用了服務元件Serivce來包含其它的元件,服務元件主要包含兩部分:聯結器和容器,這兩部分也是Tomcat容器的核心元件。
聯結器Connector
Connector的主要職責就是負責接收客戶端連線和客戶端請求的處理加工。每個Connector都將指定一個埠進行監聽,分別負責對請求報文的解析和響應報文組裝,解析過程生成Request物件,而組裝過程涉及Response物件。
如果將Tomcat整體比作一個巨大的城堡,那麼Connector元件就是城堡的城門,每個人要進入城門就必須通過城門,它為人們進出城堡提供了通道。同時,一個城堡還可能有兩個或者多個城門,每個城門代表了不同的通道(不同的網路協議)。
容器Container
我們知道Tomcat是Servlet容器的一種實現,servlet又是什麼呢?Servlet是javax.servlet 包中定義的介面。它宣告瞭 Servlet 生命週期的三個基本方法:init()、service() 和 destroy()。它們由每個 Servlet Class(在 SDK 中定義或自定義)實現,並由伺服器在特定時機呼叫。
Tomcat容器中的Container的主要功能就是處理聯結器Connector解析的到的Request,呼叫對應的servlet方法,將響應寫入Response中。此外Tomcat還對容器新增了管道和域的概念,用於對請求進行預處理。Tomcat中的容器分為四大類,按照包含關係依次為:Engin容器、Host容器、Context容器和Wrapper容器。
生命週期
Tomcat容器的啟停實現邏輯,啟停操作是如何從Server傳播到各個子容器和元件中的。以及Spring容器如何對Tomcat容器實現優雅關閉:等待Tomcat容器中的請求處理完成之後再關閉容器。
總結
本文簡要介紹了Tomcat容器中的各個關鍵元件及其功能,在我的後續部落格中會對這些元件一一進行詳細介紹。
本文最先發布至微信公眾號,版權所有,禁止轉載!