tomcat啓動原理

 

 

前言

一直在用Tomcat,可是對其啓動原理一直沒去研究,這裏準備去面試,可能會問道。因而總結了下啓動原理。徹底憑感受去揣測,沒工夫看源碼。所以錯誤之處但願你們批評指正,你們共同進步。我想這也是在忙碌中進步最快的方式了。html

 

Tomcat的結構

一個web應用是按照規範組織在一塊兒的,應用包括servlet,JSP,靜態頁面java

可是咱們常說的Tomcat是什麼?大多解釋說他是server容器。這種說法是很泛型的說法web

 

湯姆貓服務器(Server)是由一下模塊組成的面試

Servicetomcat

Connector服務器

故名思議,一個是服務,一個是鏈接器的意思。app

java是面向對象的語言,那麼若是假如我有實力來寫服務器我必定會將這個服務器封裝爲一個對象。相比換作其餘人也會這樣作。沒錯,Tomcat必定會這樣(雖然我沒看源碼可是我幹確定)。打開conf/server.xml文件。Tomcat入口必定會加載這個文件。文件最外層的server標籤就是即將被加載成Server對象的webapp

這個對象裏面有不少引用類型的屬性。其中就包含幾個咱們幾乎不太關注可是有起決定做用的監聽器。jsp

第一個顧名思義是和日誌相關的post

第二個顧名思義是監聽聲明週期的

第三個顧名思義是和虛擬機內存泄露相關的監聽

第四個是和全局資源聲明週期相關的

第五個是和線程相關的

 

好了無論其餘的了 來看server對象中最重要的屬性Service

 

 

Service

A "Service" is a collection of one or more "Connectors" that share a single "Container" Note:  A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. 

service屬性就是許多鏈接器的集合,服務不是一個容器!

 

能夠看到,Tomcat默認給定義了兩個鏈接器,鏈接器監聽在端口上監聽客戶請求

可見,service對象中的Connector對象是監聽客戶請求的,怪不得咱們經常使用的localhost:8080會跳轉就是在這裏設置的。

得到了請求後就怎麼辦呢?我開始一直想不通 後來又想既然客戶在地址欄敲www.xxw.com之類的東東就能訪問到Tomcat中的web應用那麼確定有相關的配置和定義纔對。因而往下看就找到了答案

初學Tomcat的朋友必定很好奇爲何在本地啓動localhost:8080就能訪問到本機中Tomcat自帶的web應用,緣由就是localhost:8080被監聽在8080的鏈接器捕獲,而後拿着locahost去找engine對象,交給engine對象處理。

引擎拿到了域名就會去找虛擬主機。引擎對象中的Host就是虛擬主機,虛擬主機就是裝web應用的目錄。Tomcat中的webapps目錄中放了不少應用,本身開發的服務器程序也將打成war包放在其中。若是你不想放在這裏就本身定義一個虛擬主機便可,可參考個人另外一篇文章,具體講解了如何搭建虛擬主機。

Host對象中又有一個Context,這個是配置上下文環境的。一個Context對應一個Web Application

 

總的來講 Tomcat核心server就分解完了,訪問成總結:

請求地址被鏈接器攔截  經過域名分發非引擎中的虛擬主機處理。


tomcat的線程處理

在server.xml中的<Service name="Catalina">下有一些註釋。大體意思是說多個鏈接器是共享一個線程池的,固然咱們能夠定義其餘的

這些鏈接器通常都表明一個線程,或者說鏈接器會建立多個線程等待客戶連接,若是超出就會建立更多的線程,若是屬相太多,那麼就爲客戶端的請求作排隊,若是隊列中的請求都超過必定數量就返回Connect refused

 

 

web.xml文件的加載

假設來自客戶的請求爲:  http://localhost:8080/wsota/wsota_index.jsp  1) 請求被髮送到本機端口8080,被在那裏偵聽的Coyote HTTP/1.1 Connector得到  2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應  3) Engine得到請求localhost/wsota/wsota_index.jsp,匹配它所擁有的全部虛擬主機Host  4) Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機)  5) localhost Host得到請求/wsota/wsota_index.jsp,匹配它所擁有的全部Context  6) Host匹配到路徑爲/wsota的Context(若是匹配不到就把該請求交給路徑名爲」"的Context去處理)  7) path=」/wsota」的Context得到請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet  8) Context匹配到URL PATTERN爲*.jsp的servlet,對應於JspServlet類  9) 構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet或doPost方法  10)Context把執行完了以後的HttpServletResponse對象返回給Host  11)Host把HttpServletResponse對象返回給Engine  12)Engine把HttpServletResponse對象返回給Connector  13)Connector把HttpServletResponse對象返回給客戶browser

相關文章
相關標籤/搜索