Tomcat 非常的模塊化,只要找到最核心的模塊,問題遊刃而解,瞭解整體架構對深入瞭解 Tomcat 至關重要!
本文來源:Java後端技術
1
Tomcat
頂層架構
先上一張 Tomcat 的頂層結構圖(圖A),如下:
Tomcat 中最頂層的容器是 Server,一個 Server 可以包含至少一個 Service,用於具體提供服務。
Service 包含兩個部分:Connector 和 Container。從上圖中可以看出 Tomcat 的心臟就是這兩個組件,他們的作用如下:
1、Connector 用於處理連接相關的事情,並提供 Socket與Request 和 Response 相關的轉化;
2、Container 用於封裝和管理 Servlet,以及具體處理 Request 請求;
一個 Tomcat 中只有一個 Server,但是可以有多個 Connectors,這是因爲一個服務可以有多個連接,如同時提供 Http 和 Https 鏈接,也可以提供向相同協議不同端口的連接,示意圖如下(Engine、Host、Context下邊會說到):
多個 Connector 和一個 Container 就形成了一個 Service,但是 Service 還要一個生存的環境 Server !所以整個 Tomcat 的生命週期由 Server 控制。另外,上述的包含關係或者說是父子關係,都可以在 tomcat 的 conf 目錄下的server.xml
配置文件中看出(Tomcat 版本爲8.0)
這張結構圖也能更清楚的理解:
Server 標籤設置的端口號爲 8005,shutdown=”SHUTDOWN” ,表示在8005端口監聽“SHUTDOWN”命令,如果接收到了就會關閉 Tomcat。
2
Connector和Container
的微妙關係
一個請求發送到 Tomcat 之後,首先經過 Service 然後會交給Connector,並將請求封裝爲 Request 和 Response 來具體處理,封裝之後再交由 Container 處理,然後再返回給 Connector,最後在由通過Socket 將處理結果返回客戶端,請求處理結束!
Connector 最底層使用的是 Socket 來進行連接的,Request 和 Response是按照 HTTP 協議來封裝的,所以 Connector 同時需要實現TCP/IP 協議和 HTTP 協議!Tomcat 處理請求,那麼肯定需要先接收到這個請求,接收請求這個東西我們首先就需要看一下 Connector!
3
Connector
架構分析
Connector 用於接受請求並將請求封裝成 Request 和 Response,然後交給 Container 進行處理,Container 處理完之後在交給 Connector 返回給客戶端。
因此,我們可以把 Connector 分爲四個方面進行理解:
(1)Connector如何接受請求的?
(2)如何將請求封裝成Request和Response的?
(3)封裝完之後的Request和Response如何交給Container進行處理的?
(4)Container處理完之後如何交給Connector並返回給客戶端的?
首先看一下 Connector 的結構圖(圖B),如下所示:
Connector就是使用ProtocolHandler來處理請求的,不同的ProtocolHandler 代表不同的連接類型,比如:Http11Protocol 使用的是普通Socket來連接的,Http11NioProtocol 使用的是 NioSocket 來連接的。
4
Container
架構分析
Container 用於封裝和管理 Servlet,以及具體處理 Request 請求,在Connector 內部包含了4個子容器,結構圖如下(圖C):
4個子容器的作用分別是:
(1)Engine:引擎,用來管理多個站點,一個Service最多只能有一個Engine;
(2)Host:代表一個站點,也可以叫虛擬主機,通過配置Host就可以添加站點;
(3)Context:代表一個應用程序,對應着平時開發的一套程序,或者一個WEB-INF目錄以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封裝着一個Servlet;
下面找一個 Tomcat 的文件目錄對照一下,如下圖所示:
Context 和 Host 的區別是 Context 表示一個應用,我們的 Tomcat 中默認的配置下 webapps 下的每一個文件夾目錄都是一個 Context,其中 ROOT 目錄中存放着主應用,其他目錄存放着子應用,而整個webapps就是一個 Host 站點。我們訪問應用 Context 的時候,如果是 ROOT 下的則直接使用域名就可以訪問。
5
總結
至此,我們已經對 Tomcat 的整體架構有了大致的瞭解,可以看出來每一個組件的基本要素和作用。如果你能脫口而出的聊一下 Tomcat,就會發現這不只是一種令程序員顫抖的技術,還是令面試官刮目相看的技術。