1. 程式人生 > >tomcat工作原理淺析

tomcat工作原理淺析

1 - Tomcat Server的組成部分

1.1 - Server

A Server element representsthe entire Catalina servlet container. (Singleton)

1.2 - Service

A Service element representsthe combination of o­ne or more Connector components that share a single Engine
Service
是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理所有Connector

所獲得的客戶請求

1.3 - Connector

一個Connector將在某個指定埠上偵聽客戶請求,並將獲得的請求交給Engine來處理,從Engine處獲得迴應並返回客戶
TOMCAT
有兩個典型的Connector,一個直接偵聽來自browserhttp請求,一個偵聽來自其它WebServer的請求
Coyote Http/1.1 Connector 
在埠8080處偵聽來自客戶browserhttp請求
Coyote JK2 Connector 
在埠8009處偵聽來自其它WebServer(Apache)servlet/jsp代理請求

1.4 - Engine

The Engine element representsthe entire request processing machinery associated with a particular Service
It receives and processes all requests from o­ne or more Connectors
and returns the completed response to the Connector for ultimate transmissionback to the client
Engine

下可以配置多個虛擬主機VirtualHost,每個虛擬主機都有一個域名Engine獲得一個請求時,它把該請求匹配到某個Host上,然後把該請求交給該Host來處理
Engine
有一個預設虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該預設Host來處理

1.5 - Host 

代表一個Virtual Host,虛擬主機,每個虛擬主機和某個網路域名Domain Name相匹配每個虛擬主機下都可以部署(deploy)一個或者多個Web App,每個Web App對應於一個Context,有一個Contextpath
Host獲得一個請求時,將把該請求匹配到某個Context上,然後把該請求交給該

Context來處理匹配的方法是最長匹配,所以一個path==""Context將成為該Host的預設Context
所有無法和其它Context的路徑名匹配的請求都將最終和該預設Context匹配

1.6 - Context

一個Context對應於一個Web Application,一個Web Application由一個或者多個Servlet組成
Context
在建立的時候將根據配置檔案$CATALINA_HOME/conf/web.xml$WEBAPP_HOME/WEB-INF/web.xml載入ServletContext獲得請求時,將在自己的對映表(mappingtable)中尋找相匹配的Servlet

如果找到,則執行該類,獲得請求的迴應,並返回

2 - Context的部署配置檔案web.xml的說明

一個Context對應於一個Web App,每個Web App是由一個或者多個servlet組成的當一個Web App被初始化的時候,它將用自己的ClassLoader物件載入部署配置檔案web.xml”中定義的每個servlet它首先載入在$CATALINA_HOME/conf/web.xml中部署的servlet然後載入在自己的Web App根目錄下的WEB-INF/web.xml中部署的servlet
web.xml
檔案有兩部分:servlet類定義和servlet對映定義每個被載入的servlet類都有一個名字,且被填入該Context的對映表(mappingtable)中,和某種URLPATTERN對應當該Context獲得請求時,將查詢mappingtable,找到被請求的servlet,並執行以獲得請求迴應

分析一下所有的Context共享的web.xml檔案,在其中定義的servlet被所有的Web App載入

3 - Tomcat Server處理一個http請求的過程

假設來自客戶的請求為:
http://localhost:8080/wsota/wsota_index.jsp

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