我的架構夢:(十四)Tomcat 系統架構與原理剖析

一、瀏覽器訪問服務器的流程

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資源時:

  1. HTTP服務器會把請求信息使用ServletRequest對象封裝起來;
  2. 進一步去調用Servlet容器中某個具體的Servlet
  3. 在2中,Servlet容器拿到請求後,根據URLServlet的映射關係,找到相應的Servlet
  4. 如果Servlet還沒有被加載,就用反射機制創建這個Servlet,並調用Servletinit方法來完成初始化;
  5. 接着調用這個具體Servletservice方法來處理請求,請求處理結果使用ServletResponse對象封裝;
  6. ServletResponse對象返回給HTTP服務器,HTTP服務器會把響應發送給客戶端。

在這裏插入圖片描述

3、Tomcat 系統總架構

通過上面的講解,我們發現tomcat有兩個非常重要的功能需要完成

  1. 和客戶端瀏覽器進行交互,進行socket通信,將字節流和Request/Response等對象進行轉換;
  2. Servlet容器處理業務邏輯。

在這裏插入圖片描述

Tomcat 設計了兩個核心組件連接器(Connector)和容器(Container)來完成 Tomcat 的兩大核心功能。

連接器負責對外交流: 處理Socket連接,負責網絡字節流與RequestResponse對象的轉化;

容器負責內部處理:加載和管理Servlet,以及具體處理Request請求;

三、Tomcat 連接器組件 Coyote

1、Coyote 簡介

CoyoteTomcat 中連接器的組件名稱 , 是對外的接口。客戶端通過Coyote與服務器建立連接、發送請 求並接受響應 。

  • Coyote 封裝了底層的網絡通信(Socket請求及響應處理);
  • Coyote 使Catalina 容器(容器組件)與具體的請求協議及IO操作方式完全解耦;
  • CoyoteSocket 輸入轉換封裝爲 Request 對象,進一步封裝後交由Catalina 容器進行處理,處理請求完成後, Catalina 通過Coyote 提供的Response 對象將結果寫入輸出流;
  • Coyote 負責的是具體協議(應用層)和IO(傳輸層)相關內容。

在這裏插入圖片描述

Tomcat Coyote 支持的 IO模型與協議

Tomcat支持多種應用層協議和I/O模型,如下:

在這裏插入圖片描述
8.0 之前 ,Tomcat 默認採用的I/O方式爲 BIO,之後改爲 NIO。 無論 NIONIO2 還是 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容器,而CatalinaTomcatservlet容器。

從另一個⻆度來說,Tomcat 本質上就是一款 Servlet 容器, 因爲 Catalina 纔是 Tomcat 的核心 , 其他模塊都是爲Catalina 提供支撐的。 比如 : 通過 Coyote 模塊提供鏈接通信,Jasper 模塊提供 JSP 引擎,Naming 提供JNDI 服務,Juli 提供日誌服務。

在這裏插入圖片描述

2、Servlet 容器 Catalina 的結構

Tomcat(我們往往有一個認識,Tomcat就是一個Catalina的實例,因爲CatalinaTomcat的核心)

Tomcat/Catalina實例

在這裏插入圖片描述

其實,可以認爲整個Tomcat就是一個Catalina實例,Tomcat 啓動的時候會初始化這個實例,Catalina 實例通過加載server.xml完成其他實例的創建,創建並管理一個ServerServer創建並管理多個服務, 每個服務又可以有多個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組件下有幾種具體的組件,分別是EngineHostContextWrapper。這4種組件(容器)
是父子關係。Tomcat通過一種分層的架構,使得Servlet容器具有很好的靈活性。

  • Engine
    表示整個CatalinaServlet引擎,用來管理多個虛擬站點,一個Service最多隻能有一個Engine, 但是一個引擎可包含多個Host

  • Host
    代表一個虛擬主機,或者說一個站點,可以給Tomcat配置多個虛擬主機地址,而一個虛擬主機下
    可包含多個Context

  • Context
    表示一個Web應用程序, 一個Web應用可包含多個Wrapper

  • Wrapper
    表示一個ServletWrapper 作爲容器中的最底層,不能包含子容器。

上述組件的配置其實就體現在conf/server.xml中。

好了,Tomcat 系統架構與原理剖析我們就講到這裏,下一講我們來講一下Tomcat 服務器核心配置詳解

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