Tomcat基礎(一):架構和流程

整體架構

Tomcat中最外層的容器是Server,代表整個服務器,一個Server包含至少一個Service,用於提供服務。

 

Service主要包含兩個部分:Connector和Container。Tomcat的核心就是這兩個組件,他們的作用如下:

  • Connector用於處理連接相關的操作,並提供Socket與Request和Response的轉化;
  • Container用於封裝和管理Servlet,處理Request請求;

 

一個Tomcat中只有一個Server,一個Server可以包含多個Service,一個Service只有一個Container和有多個Connectors。Service存活在Server中,整個Tomcat的生命週期由Server控制。

 

例如同時提供Http和Https鏈接,或者提供向相同協議下不同端口的連接

 

框架中的層級關係還可以通過server.xml配置文件看出來,下圖是刪除了註釋內容之後的一個完整server.xml配置文件(Tomcat版本8.0)

詳細的配置文件文件內容可以到Tomcat官網查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html

 

Server標籤設置的端口號爲8005,shutdown=”SHUTDOWN”表示在8005端口監聽SHUTDOWN命令,如果接收到了就會關閉Tomcat。一個Server有一個或者多個Service。

 

server.xml配置文件還可以通過下邊的結構圖的展現:

圖示Service左邊的內容都屬於Container的,Service下邊是Connector

 

兩大核心Connector和Container的關係

 

Connector最底層使用的是Socket來進行連接的,Request和Response按照HTTP協議來封裝,所以Connector同時實現了TCP/IP協議和HTTP協議。一個請求發送到Tomcat後,首先經過Service,然後會交給Connector,Connector接收請求並封裝爲Request和Response來具體處理,Request和Response封裝完之後再交由Container進行處理,Container處理完請求之後再返回給Connector,最後再由Connector通過Socket將處理的結果返回給客戶端,請求處理完畢。

 

Connector結構如下圖:

 

Connector使用ProtocolHandler來處理請求,不同的ProtocolHandler代表不同連接類型。比如:

  • Http11Protocol使用的是普通Socket來連接,
  • Http11NioProtocol使用的是NioSocket來連接的。

 

ProtocolHandler包含了三個部件:Endpoint、Processor、Adapter

  • Endpoint實現了TCP/IP協議,用來處理底層Socket的網絡連接。
  • Processor實現了HTTP協議,用於將Endpoint接收到的Socket封裝成Request。
  • Adapter將Request交給Container適配到Servlet容器進行具體的處理。

 

Endpoint的抽象實現AbstractEndpoint裏面定義了Acceptor和AsyncTimeout兩個內部類和一個Handler接口。Acceptor用於監聽請求,AsyncTimeout用於檢查異步Request超時,Handler用於處理接收到的Socket,在內部調用Processor進行處理。

 

Container結構如下圖:

 

Container用於封裝和管理Servlet,以及具體處理Request請求。在Container內部包含了4個子容器,分別是

  • Engine:引擎
  • Host:主機
  • Context:上下文
  • Wrapper:包裝器

Engine:表示整個Catalina的Servlet引擎·

Host:表示一個擁有數個上下文的虛擬主機·

Context:表示一個Web應用,一個Context包含一個或多個Wrapper·

Wrapper:表示一個獨立的Servlet。一個Context有一個或多個Wrapper,而Wrapper作爲容器層次中的最底層,不能包含子容器。

 

tomcat文件目錄對照

 

Context表示一個應用,Tomcat中默認配置下webapps裏的每一個文件夾都是一個Context,其中ROOT目錄中存放着主應用,其他目錄存放着子應用,而整個webapps就是一個Host站點。

 

我們訪問應用,如果是ROOT下的則直接使用域名就可以訪問,例如:www.xxx.com,如果是Host(webapps)下的其他應用,則可以使用www.xxx.com/docs進行訪問,默認指定的根應用(ROOT)是可以進行設定的,只不過Host站點下默認的主應用是ROOT。

 

Container處理請求是使用Pipeline-Valve(閥)管道來處理的。Pipeline-Valve採用責任鏈模式,即一個請求處理的過程中有很多處理者依次對請求進行相應處理,一個處理完之後將處理後的請求返回,下一個處理繼續。

 


Pipeline-Valve使用的責任鏈模式有兩個特點:

  • 每個Pipeline都有特定的Valve,而且是在管道的最後一個執行,這個Valve叫做BaseValve,BaseValve是不可刪除的。
  •  在上層容器的管道的BaseValve中會調用下層容器的管道。

 

Pipeline的處理流程圖如下:

 

Container包含的四個子容器對應的BaseValve分別在:StandardEngineValve,StandardHostValve,StandardContextValve,StandardWrapperValve。

  • Connector在接收到請求後會首先調用EnginePipeline,在Engine的管道中依次執行,按箭頭指向最後執行到WrapperPipeline的StandardWrapperValve。
  • 最後在StandardWrapperValve中創建FilterChain,這個FilterChain包含我們配置的與請求相匹配的Filter和Servlet,其doFilter方法會依次調用所有Filter的doFilter方法和Servlet的service方法。
  • 當所有的Pipeline-Valve都執行完之後就將返回的結果交給Connector,Connector再通過Socket的方式將結果返回給客戶端。

 

至此,我們已經對Tomcat的基本架構和執行流程有了大致的瞭解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章