Tomcat架構設計

Tomcat功能
我們知道如果要設計一個系統,首先是要了解需求。 Tomcat 要實現本質是2個核心功能

處理 Socket 連接,負責網絡字節流與 Request 和 Response 對象相互轉化
加載和管理 Servlet,以及具體處理 Request 請求

各個組件含義

  1. Server
    Server 頂層組件,在tomcat的世界裏一個Server 代表整個容器,,server組件會在一個指定端口接收命令,比如shutdown 命令會停止服務.

  2. Service
    service組件包括一到多個connector組件,這些connector組件將收到的請求發往同一個engine組件

  3. Connector
    組件是可選擇替換的,負責接收瀏覽器發過來的TCP連接請求,創建Request/Response,分配線程,將創建的對象傳遞給Container來處理請求

  4. Container
    Container是容器的父接口,主要負責內部的處理以及Servlet的管理。 其由四個容器組成,分別是Engine,Host,Context,Wrapper。其中Engine包含Host,Host包含Context,Content包含Wrapper,一個Servlet class對應一個Wrapper

  5. Engine
    Engine 接收來自connector組件的消息,並執行請求,返回請求給connector.再返回給客戶端.一個Engine可以包括多個host組件

  6. Host
    Host是Engine的子容器,一個Host在Engine中代表一個虛擬主機,,映射到一個主機頭,比如一個域名.Host支持多個域名映射到同一個ip。這個主機可以運行多個應用,他負責安裝和展開這些應用,並且標識這個應用,以便能夠區分他們。Host不是必需的,但是要運行 war程序,就必須要使用Host,因爲在war中必有web.xml文件,這個文件解析就需要Host,如果有多個Host就需要定義一個top容器 Engine,而Engine沒有父容器,一個Engine就代表一個完整的Servlet引擎,它的子容器通常是Context

  7. Context
    Context代表Servlet的Context,它具備Servlet運行的基本環境,理論上只要有Context就能運行Servlet,簡單的Tomcat可以沒有Engine和Host。其最重要的功能就是管理Servlet實例,Servlet實例在Context中是以Wrapper 出現的。

整體架構如下圖所示:
在這裏插入圖片描述

Connector

設計思想 :高內聚、低耦合

  • EndPoint:提供字節流給Processor
  • Processor:提供Tomcat Request對象給Adapter
  • Adapter:提供ServletRequest給容器

在這裏插入圖片描述
EndPoint
EndPoint是監聽通信端口,是對傳輸層的抽象,用來實現 TCP/IP 協議的。
對應的抽象類爲AbstractEndPoint,有很多實現類,比如NioEndPoint,JIoEndPoint等。在其中有兩個組件,一個是Acceptor,另外一個是SocketProcessor。Acceptor用於監聽Socket連接請求,SocketProcessor用於處理接收到的Socket請求
EndPoint類結構圖
在這裏插入圖片描述
Processor
Processor是用於實現HTTP協議的,也就是說Processor是針對應用層協議的抽象。
Processor接受來自EndPoint的Socket,然後解析成Tomcat Request和Tomcat Response對象,最後通過Adapter提交給容器。對應的抽象類爲AbstractProcessor,有很多實現類,比如AjpProcessor、Http11Processor等
Processor類結構圖
在這裏插入圖片描述
Adpater
ProtocolHandler接口負責解析請求並生成 Tomcat Request 類。需要把這個 Request 對象轉換成 ServletRequest。 Tomcat 引入CoyoteAdapter,這是適配器模式的經典運用,連接器調用 CoyoteAdapter 的 sevice 方法,傳入的是Tomcat Request 對象,CoyoteAdapter 負責將 Tomcat Request 轉成 ServletRequest,再調用容器的 service 方法。

connector優化圖解

Endpoint接收Socket連接,生成一個SocketProcessor任務提交到線程池去處理 SocketProcessor的run方法會調用Processor組件去解析應用層協議,Processor通過解析生成Request對象後,會調 用Adapter的service方法

在這裏插入圖片描述
步驟:

  • Endpoint內部Acceptor組件用於監聽Socket 連接請求,當發送客戶端連接到服務端Acceptor組件負責於客戶端建立連接創建Socket,每當連接客戶端發起請求,Endpoint會創建一個SocketProcessor對象SocketProcessor 用於處理接收到的 Socket 請求,它實現 Runnable 接口,在 run 方法裏調用協議處理組件 Processor 進行處理。爲了提高處理能力,SocketProcessor 被提交到線程池來執行。而這個線程池叫作執行器(Executor)

  • Processor 接收來自 Endpoint 的 Socket,讀取字節流解析成 Tomcat Request 和 Response 對象,接着會調用 Adapter 的 Service 方法。並通過 Adapter 將其提交到容器處理

  • 連接器調用 CoyoteAdapter 的 sevice 方法,傳入的是 Tomcat Request 對象,CoyoteAdapter 負責將 Tomcat Request 轉成 ServletRequest,再調用容器的 service 方法。

ProtocolHandler組件
ProtocolHandler組件EndPoint組件,Processor組件合併在一起表示協議處理器。用來處理tomcat支持多種IO模型和多種協議的組件

ProtocolHandler類圖
在這裏插入圖片描述

Servlet容器
Container本質上是一個Servlet容器,負責servelt的加載和管理,處理請求ServletRequest,並返回標準的 ServletResponse 對象給連接器

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