Tomcat原理
Tomcat頂層架構
Tomcat的頂層結構圖:
1、Tomcat中最頂層的容器是Server,代表著整個服務器,一個Server可以包含至少一個Service,用于具體提供服務。
2、Service主要包含兩個部分:Connector和Container。 Tomcat 的心臟就是這兩個組件,這兩個組件的作用:Connector用于處理連接相關的事情,并提供Socket與Request和Response相關的轉化;Container用于封裝和管理Servlet,以及具體處理Request請求。
3、一個Tomcat中只有一個Server,一個Server可以包含多個Service,一個Service只有一個Container,但是可以有多個Connectors,因為一個服務可以有多個連接,如同時提供Http和Https鏈接,也可以提供向相同協議不同端口的連接。
4、多個 Connector 和一個 Container 就形成了一個 Service,有了 Service 就可以對外提供服務了,但是 Service 還要一個生存的環境,必須要有人能夠給她生命、掌握其生死大權,那就非 Server 莫屬了!所以整個 Tomcat 的生命周期由 Server 控制。另外,上述的包含關系或者說是父子關系,都可以在tomcat的conf目錄下的server.xml配置文件中看出。
5、Server標簽設置的端口號為8005,shutdown=”SHUTDOWN” ,表示在8005端口監聽“SHUTDOWN”命令,如果接收到了就會關閉Tomcat。一個Server有一個Service,當然還可以進行配置,一個Service有多個,Service左邊的內容都屬于Container的,Service下邊是Connector。
Server處理HTTP請求
原理圖
1.用戶在瀏覽器中輸入該網址,請求被發送到本機端口8080,被在那里監聽的Coyote HTTP/1.1 Connector獲得;
2.Connector把該請求交給它所在的Service的Engine(Container)來處理,并等待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。
Connector架構分析
Connector用于接受請求并將請求封裝成Request和Response,然后交給Container進行處理,Container處理完之后在交給Connector返回給客戶端。Connector的結構圖:
Connector就是使用ProtocolHandler來處理請求的,不同的ProtocolHandler代表不同的連接類型,比如:Http11Protocol使用的是普通Socket來連接的,Http11NioProtocol使用的是NioSocket來連接的。其中ProtocolHandler由包含了三個部件:Endpoint、Processor、Adapter:
(1)Endpoint用來處理底層Socket的網絡連接,Processor用于將Endpoint接收到的Socket封裝成Request,Adapter用于將Request交給Container進行具體的處理。
(2)Endpoint由于是處理底層的Socket網絡連接,因此Endpoint是用來實現TCP/IP協議的,而Processor用來實現HTTP協議的,Adapter將請求適配到Servlet容器進行具體的處理。
(3)Endpoint的抽象實現AbstractEndpoint里面定義的Acceptor和AsyncTimeout兩個內部類和一個Handler接口。Acceptor用于監聽請求,AsyncTimeout用于檢查異步Request的超時,Handler用于處理接收到的Socket,在內部調用Processor進行處理。
Container架構分析
Container用于封裝和管理Servlet,以及具體處理Request請求,在Connector內部包含了4個子容器,結構圖如下(圖C):
?
4個子容器的作用分別是:
(1)Engine:引擎,用來管理多個站點,一個Service最多只能有一個Engine;
(2)Host:代表一個站點,也可以叫虛擬主機,通過配置Host就可以添加站點;
(3)Context:代表一個應用程序,對應著平時開發的一套程序,或者一個WEB-INF目錄以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封裝著一個Servlet;
下面找一個Tomcat的文件目錄對照一下,如下圖所示:
Context和Host的區別是Context表示一個應用,我們的Tomcat中默認的配置下webapps下的每一個文件夾目錄都是一個Context,其中ROOT目錄中存放著主應用,其他目錄存放著子應用,而整個webapps就是一個Host站點。
我們訪問應用Context的時候,如果是ROOT下的則直接使用域名就可以訪問,例如:www.hern.com,如果是Host(webapps)下的其他應用,則可以使用http://www.hern.com/docs進行訪問,當然默認指定的根應用(ROOT)是可以進行設定的,只不過Host站點下默認的主營用是ROOT目錄下的。
Container處理請求
?Container處理請求是使用Pipeline-Valve管道來處理的!(Valve是閥門之意)Pipeline-Valve是責任鏈模式,責任鏈模式是指在一個請求處理的過程中有很多處理者依次對請求進行處理,每個處理者負責做自己相應的處理,處理完之后將處理后的請求返回,再讓下一個處理著繼續處理。但是Pipeline-Valve使用的責任鏈模式和普通的責任鏈模式有些不同,區別主要有以下兩點:
(1)每個Pipeline都有特定的Valve,而且是在管道的最后一個執行,這個Valve叫做BaseValve,BaseValve是不可刪除的;
(2)在上層容器的管道的BaseValve中會調用下層容器的管道。
Container包含四個子容器,而這四個子容器對應的BaseValve分別在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。
Pipeline的處理流程圖如下(圖D):
(1)Connector在接收到請求后會首先調用最頂層容器的Pipeline來處理,這里的最頂層容器的Pipeline就是EnginePipeline(Engine的管道);
(2)在Engine的管道中依次會執行EngineValve1、EngineValve2等等,最后會執行StandardEngineValve,在StandardEngineValve中會調用Host管道,然后再依次執行Host的HostValve1、HostValve2等,最后在執行StandardHostValve,然后再依次調用Context的管道和Wrapper的管道,最后執行到StandardWrapperValve。
(3)當執行到StandardWrapperValve的時候,會在StandardWrapperValve中創建FilterChain,并調用其doFilter方法來處理請求,這個FilterChain包含著我們配置的與請求相匹配的Filter和Servlet,其doFilter方法會依次調用所有的Filter的doFilter方法和Servlet的service方法,這樣請求就得到了處理!
(4)當所有的Pipeline-Valve都執行完之后,并且處理完了具體的請求,這個時候就可以將返回的結果交給Connector了,Connector在通過Socket的方式將結果返回給客戶端。
Connector和Container的微妙關系
當一個請求發送到Tomcat之后,首先經過Service然后會交給Connector,Connector用于接收請求并將接收的請求封裝為Request和Response來具體處理,Request和Response封裝完之后再交由Container進行處理,Container處理完請求之后再返回給Connector,最后在由Connector通過Socket將處理的結果返回給客戶端,這樣整個請求的就處理完了!
Connector最底層使用的是Socket來進行連接的,Request和Response是按照HTTP協議來封裝的,所以Connector同時需要實現TCP/IP協議和HTTP協議!
Tomcat頂層架構小結
(1)Tomcat中只有一個Server,一個Server可以有多個Service,一個Service可以有多個Connector和一個Container;
(2) Server掌管著整個Tomcat的生死大權;
(4)Service 是對外提供服務的;
(5)Connector用于接受請求并將請求封裝成Request和Response來具體處理;
(6)Container用于封裝和管理Servlet,以及具體處理request請求;
總結
- 上一篇: windows下载安装adb(极其简单)
- 下一篇: [密码学基础][每个信息安全博士生应该知