一、瀏覽器訪問服務器的流程
b/s (瀏覽器/服務器模式) 瀏覽器是客戶端(發送http請求)-——> 服務器端
http請求的處理過程
注意:瀏覽器訪問服務器使用的是Http
協議,Http
是應用層協議,用於定義數據通信的格式,具體的數據傳輸使用的是TCP/IP
協議。
二、Tomcat 系統總體架構
1、Tomcat 請求處理大致過程
Tomcat是一個Http服務器(能夠接收並且處理http請求,所以tomcat是一個Http服務器)
我們使用瀏覽器向某一個網站發起請求,發出的是Http
請求,那麼在遠程,Http
服務器接收到這個請求 之後,會調用具體的程序(Java
類)進行處理,往往不同的請求由不同的Java
類完成處理。
如果Http服務器(Tomcat)直接調用業務處理類完成業務處理的話存在一定的問題:Tomcat與業務類耦合在一起了。
架構進行優化後:
HTTP
服務器接收到請求之後把請求交給Servlet
容器來處理,Servlet
容器通過Servlet接口調用業務 類。Servlet接口
和Servlet容器
這一整套內容叫作Servlet規範
。
注意:Tomcat
既按照Servlet規範
的要求去實現了Servlet容器
,同時它也具有HTTP服務器
的功能。
Tomcat
的兩個重要身份:
Http
服務器Tomcat
是一個Servlet
容器
2、Tomcat Servlet容器處理流程
當用戶請求某個URL
資源時:
HTTP
服務器會把請求信息使用ServletRequest
對象封裝起來;- 進一步去調用
Servlet
容器中某個具體的Servlet
; - 在2中,
Servlet
容器拿到請求後,根據URL
和Servlet
的映射關係,找到相應的Servlet
; - 如果
Servlet
還沒有被加載,就用反射機制創建這個Servlet
,並調用Servlet
的init
方法來完成初始化; - 接着調用這個具體
Servlet
的service
方法來處理請求,請求處理結果使用ServletResponse
對象封裝; - 把
ServletResponse
對象返回給HTTP
服務器,HTTP
服務器會把響應發送給客戶端。
3、Tomcat 系統總架構
通過上面的講解,我們發現tomcat
有兩個非常重要的功能需要完成
- 和客戶端瀏覽器進行交互,進行
socket
通信,將字節流和Request/Response
等對象進行轉換; Servlet
容器處理業務邏輯。
Tomcat
設計了兩個核心組件連接器(Connector
)和容器(Container
)來完成 Tomcat
的兩大核心功能。
連接器
,負責對外交流: 處理Socket
連接,負責網絡字節流與Request
和Response
對象的轉化;
容器
,負責內部處理:加載和管理Servlet
,以及具體處理Request
請求;
三、Tomcat 連接器組件 Coyote
1、Coyote 簡介
Coyote
是Tomcat
中連接器的組件名稱 , 是對外的接口。客戶端通過Coyote
與服務器建立連接、發送請 求並接受響應 。
Coyote
封裝了底層的網絡通信(Socket
請求及響應處理);Coyote
使Catalina
容器(容器組件)與具體的請求協議及IO
操作方式完全解耦;Coyote
將Socket
輸入轉換封裝爲Request
對象,進一步封裝後交由Catalina
容器進行處理,處理請求完成後,Catalina
通過Coyote
提供的Response
對象將結果寫入輸出流;Coyote
負責的是具體協議(應用層)和IO
(傳輸層)相關內容。
Tomcat
Coyote
支持的 IO
模型與協議
Tomcat
支持多種應用層協議和I/O
模型,如下:
在 8.0
之前 ,Tomcat
默認採用的I/O
方式爲 BIO
,之後改爲 NIO
。 無論 NIO
、NIO2
還是 APR
, 在性能方面均優於以往的BIO
。 如果採用APR
, 甚至可以達到 Apache HTTP Server
的影響性能。
2、Coyote 的內部組件及流程
Coyote
組件及作用:
組件 | 作用描述 |
---|---|
EndPoint | EndPoint 是 Coyote 通信端點,即通信監聽的接口,是具體Socket接收和發 送處理器,是對傳輸層的抽象,因此EndPoint用來實現TCP/IP協議的。 |
Processor | Processor 是Coyote 協議處理接口 ,如果說EndPoint是用來實現TCP/IP協 議的,那麼Processor用來實現HTTP協議,Processor接收來自EndPoint的 Socket,讀取字節流解析成Tomcat Request和Response對象,並通過 Adapter將其提交到容器處理,Processor是對應用層協議的抽象。 |
ProtocolHandler | Coyote 協議接口, 通過Endpoint 和 Processor , 實現針對具體協議的處 理能力。Tomcat 按照協議和I/O 提供了6個實現類 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol。 |
Adapter | 由於協議不同,客戶端發過來的請求信息也不盡相同,Tomcat定義了自己的 Request類來封裝這些請求信息。ProtocolHandler接口負責解析請求並生成 Tomcat Request類。但是這個Request對象不是標準的ServletRequest,不 能用Tomcat Request作爲參數來調用容器。Tomcat設計者的解決方案是引 入CoyoteAdapter,這是適配器模式的經典運用,連接器調用 CoyoteAdapter的Sevice方法,傳入的是Tomcat Request對象, CoyoteAdapter負責將Tomcat Request轉成ServletRequest,再調用容器。 |
四、Tomcat Servlet 容器 Catalina
1、 Tomcat 模塊分層結構圖及Catalina位置
Tomcat
是一個由一系列可配置(conf/server.xml
)的組件構成的Web
容器,而Catalina
是Tomcat
的 servlet
容器。
從另一個⻆度來說,Tomcat
本質上就是一款 Servlet
容器, 因爲 Catalina
纔是 Tomcat
的核心 , 其他模塊都是爲Catalina
提供支撐的。 比如 : 通過 Coyote
模塊提供鏈接通信,Jasper
模塊提供 JSP
引擎,Naming
提供JNDI
服務,Juli
提供日誌服務。
2、Servlet 容器 Catalina 的結構
Tomcat
(我們往往有一個認識,Tomcat
就是一個Catalina
的實例,因爲Catalina
是Tomcat
的核心)
Tomcat/Catalina
實例
其實,可以認爲整個Tomcat
就是一個Catalina
實例,Tomcat
啓動的時候會初始化這個實例,Catalina
實例通過加載server.xml
完成其他實例的創建,創建並管理一個Server
,Server
創建並管理多個服務, 每個服務又可以有多個Connector
和一個Container
。
一個Catalina
實例(容器)
一個 Server
實例(容器)
多個Service
實例(容器)
每一個Service
實例下可以有多個Connector
實例和一個Container
實例
Catalina
負責解析Tomcat
的配置文件(server.xml
) , 以此來創建服務器Server組件並進行管理。Server
服務器表示整個Catalina Servlet
容器以及其它組件,負責組裝並啓動Servlaet
引擎,Tomcat
連接器。Server
通過實現Lifecycle
接口,提供了一種優雅的啓動和關閉整個系統的方式。Service
服務是Server
內部的組件,一個Server
包含多個Service
。它將若干個Connector
組件綁定到一個Container
。Container
容器,負責處理用戶的servlet
請求,並返回對象給web
用戶的模塊。
3、Container 組件的具體結構
Container
組件下有幾種具體的組件,分別是Engine
、Host
、Context
和Wrapper
。這4種組件(容器)
是父子關係。Tomcat
通過一種分層的架構,使得Servlet
容器具有很好的靈活性。
-
Engine
表示整個Catalina
的Servlet
引擎,用來管理多個虛擬站點
,一個Service
最多隻能有一個Engine
, 但是一個引擎可包含多個Host
。 -
Host
代表一個虛擬主機
,或者說一個站點,可以給Tomcat
配置多個虛擬主機地址,而一個虛擬主機下
可包含多個Context
。 -
Context
表示一個Web
應用程序, 一個Web
應用可包含多個Wrapper
。 -
Wrapper
表示一個Servlet
,Wrapper
作爲容器中的最底層,不能包含子容器。
上述組件的配置其實就體現在conf/server.xml
中。
好了,Tomcat 系統架構與原理剖析我們就講到這裏,下一講我們來講一下Tomcat 服務器核心配置詳解。