Tomcat源碼分析:Socket網絡通信和線程模型體系結構設計

一、概述

Tomcat在設計當中,自頂向下主要包括:Catalina容器,Coyte連接器和底層Socket通信端點EndPoint三部分組成。底層Socket通信端點EndPoint主要完成socket通信的相關細節和整個Tomcat框架線程模型的實現。

服務啓動:Tomcat啓動時,從Catalina容器開始啓動,往下依次創建和啓動Coyote連接器,創建服務端監聽請求socket和請求處理工作線程池。

請求處理:在客戶端發起連接請求時,則是服務端監聽請求socket先監聽到客戶端連接請求,然後處理socket三次握手等細節,將對應的channel註冊NIO的selector,由selector負責監聽該客戶端後續數據請求到來。當客戶端發起數據請求時,則從工作線程池獲取一個線程,由該線程負責該請求整體的處理過程,包括通過coyte連接器傳送到Catalina容器,交給對應的應用處理。

二、Socket體系和線程模型

這裏主要基於NIO的socket對Tomcat的Socket和線程模型體系結構進行分析。

在Tomcat的體系結構設計當中,上層的Catalina容器和Coyte連接器主要是對Servlet規範的實現,其中並不涉及底層通信相關的數據處理和線程分配邏輯,而這部分主要是在底層socket通信Endpoint來完成。

Endpoint

Tomcat主要通過Endpoint來抽象底層整體的socket通信和線程模型設計,在抽象類AbstractEndpoint中負責定義。

socket通信tcp相關和線程相關的屬性的默認值;
socket請求監聽器Acceptor;
socket數據處理器Handler;
工作線程池Executor;
Endpoint整體的初始化init,監聽端口綁定,啓動start,關閉stop的骨架實現。

啓動流程

綁定服務端請求監聽端口
創建工作線程池executor
啓動Poller線程
啓動Acceptor線程

Acceptor線程

線程數量默認爲1
接收客戶端連接請求,然後將該請求對應的channel綁定到Poller的selector中。

Poller線程

線程數量爲2和處理器數量之間的最小值
每個poller內部包含一個selector,由該selector監聽綁定到其上的channel的selectionKey來獲取讀寫事件。
在NIO2中已經不存在Poller了,Acceptor接收到客戶端連接請求後,創建一個與該連接請求對應的SocketProcessor,從工作線程池獲取一個線程,將該SocketProcessor在該線程執行。

Executor工作線程池

線程數量默認最大爲200,初始化爲10.
Poller監聽到客戶端socket的數據讀寫請求時,創建一個SocketProcessor處理器,然後從工作線程池Executor中獲取一個線程,讓該SocketProcessor在這個線程中執行。在SocketProcessor中,通過Handler來將請求往上傳給Coyte連接器和Catalina容器。

NioSocketWrapper

對Socket進行包裝,添加poller等的引用,以及定義字節數據讀寫的方法。

SocketProcessor

Socket數據處理器,實現Runnable接口,在run方法中對socket請求數據進行處理,以及調用Handler將數據往上傳給Coyte連接器和Catalina容器。

從工作線程池Executor中獲取一個工作線程來執行以上過程。

Handler

鏈接Endpoint和Coyte連接器和Catalina容器,將底層數據往上傳給Catalina容器處理。

三、TCP和連接相關默認值

連接數相關

最大連接數:10000,在NIO2中爲-1,表示不限制。

http和tcp相關

KeepAlive最大請求數:100
TCP backlog:100
TCP nodelay:true
Http請求headers最大數量:100

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