1. 程式人生 > >Tomcat內部結構、工作原理、工作模式和執行模式

Tomcat內部結構、工作原理、工作模式和執行模式

##Tomcat的內部結構

Tomcat是一個基於元件的伺服器,它的構成元件都是可配置的,其中最外層的是Catalina servlet容器,其他元件按照一定的格式要求配置在這個頂層容器中。Tomcat的各種元件都是在Tomcat安裝目錄下的/conf/server.xml檔案中配置的。
###Tomcat的四種元件

1.頂層類元素
比如Server和Service

2.聯結器類元素
聯結器類元素代表了介於客戶與服務之間的通訊介面,負責將客戶的請求傳送給伺服器,並將伺服器的響應傳遞給客戶。

3.容器類元素
容器類元素代表處理客戶請求並生成響應結果的元件,有三種容器類元素:Engine、Host和Context。Engine為特定的Service元件處理所有客戶的請求,Host元件為特定的虛擬主機處理所有的客戶請求。Context元件為特定的Web應用處理所有的客戶請求。

4.巢狀類元素
巢狀類元素代表了可以新增到容器中的元件,比如Logger元素、Valve元素和Realm元素。

###Tomcat的體系結構

Tomcat的體系結構可以由Server.xml看出一二

<Server>   ...   
          	
	<Service>    ...  
	<!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" 
	譯:service由多個connectors組成,多個service共享一個container(容器)。
	
	Note: A "Service" is not itself a "Container",so you may not define subcomponents such as 
	"Valves" at this level.Documentation at /docs/config/service.html -->       
	      
		<Connector>  ...
		<!--The connectors can use a shared executor, you can define one or more named thread pools-->
		譯:多個connector共享一個執行器(指Engine),你能定義一個或多個執行緒進入執行緒池。//這個按照我的理解翻譯的
		
		<!-- A "Connector" using the shared thread pool-->
		譯:一個connector共享一個執行緒池
        </Connector>
        
        <Engine> ...  
        <!-- An Engine represents the entry point (within Catalina) that processes every request.
        譯:一個Engine代表處理滅個request請求的入口點(在Catalina中)
         The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> 
            
			<Host>   ... 
			               
				<Context>  ...
				                  
				</Context>
				
            </Host>
            
        </Engine>
        
    </Service>
    
</Server>

這裡寫圖片描述
Server元素代表整個Catalina Servlet容器,它是Tomcat例項的頂層元素,其中可以包含一個或者多個Service元素。

Service元素包含一個Engine元素以及一個或者個多個Connector元素,這些Connector共享同一個Engine元素。

Connector元素代表和客戶程式實際互動的元件,它負責接受客戶的請求,以及向客戶返回響應結果。

每個Service元素只能包含一個Engine元素,Engine元素可以處理在同一個Service中所有Connector元素接受到的客戶請求。

一個Engine元素可以包含多個Host元素。

每個Host元素定義了一個主機,它可以包含一個或者多個Web應用。

Context是使用得最頻繁的元素,每個Context元素代表了執行在虛擬機器上的單個Web應用,一個Host元素中可以包含多個Context元素。

###Container與Connector

Connecter元件
一個Connecter將在某個指定的埠上偵聽客戶請求,接收瀏覽器的發過來的 tcp 連線請求,建立一個 Request 和 Response 物件分別用於和請求端交換資料,然後會產生一個執行緒來處理這個請求並把產生的 Request 和 Response 物件傳給處理Engine(Container中的一部分),從Engine出獲得響應並返回客戶。

Tomcat中有兩個經典的Connector,一個直接偵聽來自Browser的HTTP請求,另外一個來自其他的WebServer請求。Cotote HTTP/1.1 Connector在埠8080處偵聽來自客戶Browser的HTTP請求,Coyote JK2 Connector在埠8009處偵聽其他Web Server的Servlet/JSP請求。

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

Container元件
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 引擎。

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

Tomcat作為Servlet容器,負責處理客戶請求,把請求傳送給Servlet並把結果返回給客戶。
Servlet容器與Servlet介面是由Java Servlet API定義的。

tomcat和tomcat中的應用(即webapps下的war包)是執行在同一個jvm中的,但分工不同。
tomcat的角色是“排程員”,而你的應用的角色是“工作者”,tomcat處理一個請求的大致過程如下:
這裡寫圖片描述
1、使用者點選網頁內容,請求被髮送到本機埠8080,被在那裡監聽的Coyote HTTP/1.1 Connector獲得。

2、tomcat將此請求作為任務加入一個佇列中,執行緒池中若干工作者執行緒從這個佇列中獲取任務,並把該請求交給它所在的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。

##Tomcat的工作模式和執行模式
###工作模式
Tomcat作為servlet容器,有三種工作模式:

1、獨立的servlet容器,servlet容器是web伺服器的一部分;

2、程序內的servlet容器,servlet容器是作為web伺服器的外掛和java容器的實現,web伺服器外掛在內部地址空間開啟一個jvm使得java容器在內部得以執行。反應速度快但伸縮性不足;

3、程序外的servlet容器,servlet容器運行於web伺服器之外的地址空間,並作為web伺服器的外掛和java容器實現的結合。反應時間不如程序內但伸縮性和穩定性比程序內優;
###執行模式
Tomcat Connector(聯結器)有三種執行模式:
1.bio(blocking I/O)
即阻塞式I/O操作,表示Tomcat使用的是傳統的Java I/O操作(即java.io包及其子包)。
一個執行緒處理一個請求,缺點:併發量高時,執行緒數較多,浪費資源。

2.nio(new I/O)
Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的併發執行效能。
利用 Java 的非同步請求 IO 處理,可以通過少量的執行緒處理大量的請求。

3.apr(Apache Portable Runtime/Apache可移植執行時)
Tomcat將以JNI的形式呼叫Apache HTTP伺服器的核心動態連結庫來處理檔案讀取或網路傳輸操作,從而大大地提高Tomcat對靜態檔案的處理效能。Tomcat apr也是在Tomcat上執行高併發應用的首選模式。

注:能寫這麼多,也只是吸取了前輩們的經驗,有什麼不對的地方恭請斧正。