1. 瀏覽器訪問服務器的流程
瀏覽器訪問服務器使用的是 Http協議 , Http協議 是應用層協議,用于定義數據通信的格式,具體的數據傳輸使用的是 TCP/IP協議 。
2. Tomcat 系統總體架構
Tomcat是一個 Http服務器 (能夠接受并且處理 http 請求,所以 Tomcat 是一個 Http服務器 )。
2.1. Tomcat 處理請求大致流程
HTTP服務器接收到請求之后把請求交給 Servlet容器 來處理, Servlet容器 通過 Servlet接? 調?業務類。
Servlet接?和 Servlet容器 這?整套內容叫作 Servlet規范 。
Servlet容器有解耦的作用,避免 Http服務器 和 業務類 的直接耦合。
由于 Tomcat 根據 Servlet規范 實現了 Servlet容器 ,同時它又具有 Http服務器 的功能,所以 Tomcat 擁有兩個重要身份:
- Servlet容器
- Http服務器
2.2. Tomcat Servlet容器處理流程
當用戶請求某個URL資源時:
- 1) Http服務器 會把請求信息封裝成 Request對象 ,再轉化成 ServletRequest對象 ,傳入 Servlet容器 ;
- 2) Servlet容器 接收到請求后,根據 URL 和 Servlet 的映射關系(必要的配置信息),找到對應的 Servlet ;
- 3) 如果 Servlet 還沒有被加載,使用 反射技術 創建該 Servlet ,并調用 Servlet 的 init 方法來完成初始化;
- 4) 調用 Servlet 的 service 方法處理請求,將請求處理結果封裝成 ServletResponse 對象,返回給 Http服務器 ;
- 5) Http服務器 將接收到的 ServletResponse對象 轉化成 Response對象 ,返回給客戶端。
2.3. Tomcat 系統總體架構
Tomcat設計了兩個核心組件 連接器(Connector) 和 容器(Container) 來完成 Tomcat 的兩大核心功能:
- 連接器:負責對外交流 ,處理Socket連接,負責 網絡字節流 和 Request/Response 對象的轉化;
- 容器:負責內部處理 ,加載和管理Servlet,以及具體請求的處理。
3. Tomcat 連接器組件 Coyote
3.1. Coyote簡介
Coyote是 Tomcat連接器組件 的名稱,是對外的接口。客戶端通過 Coyote 與服務端建立連接、發送請求并接受響應。
Coyote負責的是 具體協議(應用層) 和 IO(傳輸層) 的相關內容:
- Coyote 封裝了底層的網絡通信(Socket請求及響應處理)
- Coyote 使 Catalina容器(容器組件) 與具體的 請求協議 和 IO操作方式 完全解耦
- Coyote 將 Socket 輸入轉化封裝為 Request對象 ,進一步交給 Catalina容器 處理,處理完成后, Catalina容器 通過 Coyote 提供的 Response對象 將結果寫入輸出流
Tomcat (Coyote)支持多種應用層協議和I/O模型:
在 8.0 版本之前, Tomcat 默認采用的 I/O模型 是 BIO , 8.0 版本之后,改為 NIO 。
3.2. Coyote內部組件及流程
Coyote內部各組件的作用:
組件作用EndPointEndPoint 是 Coyote 的通信端點,即通信監聽的接口,是具體 Socket 接收和發送的處理器,是對 傳輸層的抽象 。因此 EndPoint 用來實現 TCP/IP協議ProcessorProcessor 是 Coyote 的協議處理接口,用來實現 HTTP協議 , Processor 接收來? EndPoint 的 Socket ,讀取字節流解析成 Tomcat Request 和 Response對象 ,并通過 Adapter 將其提交到容器處理, Processor 是對應?層協議的抽象ProtocolHandlerCoyote 協議接?,通過 Endpoint 和 Processor , 實現針對具體協議的處理能?。 Tomcat 按照協議和I/O 提供了6個實現類 : AjpNioProtocol , AjpAprProtocol , AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol , Http11AprProtocolAdapterCoyoteAdapter 負責將 Tomcat Request 轉成 ServletRequest ,再調?容器
4. Tomcat Servlet 容器 Catalina
4.1. Tomcat模塊分層結構圖和Catalina的地位
Tomcat是由一系列可配置(conf/server.xml)的組件構成的 Web容器 ,而 Catalina 是 Tomcat 的 Servlet容器 。
Tomcat本質上就是?款 Servlet容器 , 因為 Catalina 才是 Tomcat 的核? , 其他模塊都是為 Catalina 提供?撐的。 ?如 : 通過 Coyote 模塊提供鏈接通信, Jasper 模塊提供 JSP引擎 , Naming 提供 JNDI服務 , Juli 提供 ?志服務 。
4.2. Servlet 容器 Catalina 的結構
我們往往有?個認識, Tomcat 就是?個 Catalina 的實例,因為 Catalina 是 Tomcat 的核?。
Tomcat/Catalina實例:
其實,可以認為整個 Tomcat 就是?個 Catalina實例 , Tomcat 啟動的時候會初始化這個實例, Catalina實例 通過加 server.xml 完成其他實例的創建,創建并管理?個 Server , Server 創建并管理多個 服務(Service) ,每個 服務(Service) ?可以有多個 Connector 和?個 Container 。
- Catalina負責解析Tomcat的配置文件(server.xml),以此來創建Server組件并進行管理
- Server負責組裝并啟動Servlaet引擎,Tomcat連接器。Server通過實現Lifecycle接?,提供了?種優雅的啟動和關閉整個系統的?式
- Service服務是Server內部的組件,?個Server包含多個Service。它將若?個Connector組件綁定到?個Container
- Container容器,負責處理?戶的servlet請求,并返回對象給web?戶的模塊
4.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 作為容器中的最底層,不能包含?容器