天天看點

Tomcat原理介紹

一、概念

Tomcat 伺服器是一個開源的輕量級Web應用伺服器,在中小型系統和并發量小的場合下被普遍使用,是開發和調試Servlet、JSP 程式的首選。

二、原理

Tomcat結構圖:

Tomcat原理介紹

  • Tomcat主要元件:伺服器Server,服務Service,連接配接器Connector、容器Container。連接配接器Connector和容器Container是Tomcat的核心。
  • 一個Container容器和一個或多個Connector組合在一起,加上其他一些支援的元件共同組成一個Service服務,有了Service服務便可以對外提供能力了,但是Service服務的生存需要一個環境,這個環境便是Server,Server元件為Service服務的正常使用提供了生存環境,Server元件可以同時管理一個或多個Service服務。

三、兩大元件

1、Connector

一個Connecter将在某個指定的端口上偵聽客戶請求,接收浏覽器的發過來的 tcp 連接配接請求,建立一個 Request 和 Response 對象分别用于和請求端交換資料,然後會産生一個線程來處理這個請求并把産生的 Request 和 Response 對象傳給處理Engine(Container中的一部分),從Engine出獲得響應并傳回客戶。

Tomcat中有兩個經典的Connector,一個直接偵聽來自Browser的HTTP請求,另外一個來自其他的WebServer請求。HTTP/1.1 Connector在端口8080處偵聽來自客戶Browser的HTTP請求,AJP/1.3 Connector在端口8009處偵聽其他Web Server(其他的HTTP伺服器)的Servlet/JSP請求。

Connector 最重要的功能就是接收連接配接請求然後配置設定線程讓 Container 來處理這個請求,是以這必然是多線程的,多線程的處理是 Connector 設計的核心。

2、Container

Tomcat原理介紹

Container是容器的父接口,該容器的設計用的是典型的責任鍊的設計模式,它由四個自容器元件構成,分别是Engine、Host、Context、Wrapper。這四個元件是負責關系,存在包含關系。通常一個Servlet class對應一個Wrapper,如果有多個Servlet定義多個Wrapper,如果有多個Wrapper就要定義一個更高的Container,如Context。

Context 還可以定義在父容器 Host 中,Host 不是必須的,但是要運作 war 程式,就必須要 Host,因為 war 中必有 web.xml 檔案,這個檔案的解析就需要 Host 了,如果要有多個 Host 就要定義一個 top 容器 Engine 了。而 Engine 沒有父容器了,一個 Engine 代表一個完整的 Servlet 引擎。

  • Engine 容器

Engine 容器比較簡單,它隻定義了一些基本的關聯關系

  • Host 容器

Host 是 Engine 的子容器,一個 Host 在 Engine 中代表一個虛拟主機,這個虛拟主機的作用就是運作多個應用,它負責安裝和展開這些應用,并且辨別這個應用以便能夠區分它們。它的子容器通常是 Context,它除了關聯子容器外,還有就是儲存一個主機應該有的資訊。

  • Context 容器

Context 代表 Servlet 的 Context,它具備了 Servlet 運作的基本環境,理論上隻要有 Context 就能運作 Servlet 了。簡單的 Tomcat 可以沒有 Engine 和 Host。Context 最重要的功能就是管理它裡面的 Servlet 執行個體,Servlet 執行個體在 Context 中是以 Wrapper 出現的,還有一點就是 Context 如何才能找到正确的 Servlet 來執行它呢? Tomcat5 以前是通過一個 Mapper 類來管理的,Tomcat5 以後這個功能被移到了 request 中,在前面的時序圖中就可以發現擷取子容器都是通過 request 來配置設定的。

  • Wrapper 容器

Wrapper 代表一個 Servlet,它負責管理一個 Servlet,包括的 Servlet 的裝載、初始化、執行以及資源回收。Wrapper 是最底層的容器,它沒有子容器了,是以調用它的 addChild 将會報錯。

Wrapper 的實作類是 StandardWrapper,StandardWrapper 還實作了擁有一個 Servlet 初始化資訊的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各種資訊打交道。

3、其他元件

Tomcat 還有其它重要的元件,如安全元件 security、logger 日志元件、session、mbeans、naming 等其它元件。這些元件共同為 Connector 和 Container 提供必要的服務。

四、HTTP請求過程

Tomcat原理介紹

Tomcat Server處理一個HTTP請求的過程

1、使用者點選網頁内容,請求被發送到本機端口8080,被在那裡監聽的Coyote HTTP/1.1 Connector獲得。

2、Connector把該請求交給它所在的Service的Engine來處理,并等待Engine的回應。

3、Engine獲得請求localhost/test/index.jsp,比對所有的虛拟主機Host。

4、Engine比對到名為localhost的Host(即使比對不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機),名為localhost的Host獲得請求/test/index.jsp,比對它所擁有的所有的Context。Host比對到路徑為/test的Context(如果比對不到就把該請求交給路徑名為“ ”的Context去處理)。

5、path=“/test”的Context獲得請求/index.jsp,在它的mapping table中尋找出對應的Servlet。Context比對到URL PATTERN為*.jsp的Servlet,對應于JspServlet類。

6、構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet()或doPost().執行業務邏輯、資料存儲等程式。

7、Context把執行完之後的HttpServletResponse對象傳回給Host。

8、Host把HttpServletResponse對象傳回給Engine。

9、Engine把HttpServletResponse對象傳回Connector。

10、Connector把HttpServletResponse對象傳回給客戶Browser。