1 前言
最近在複習 Tomcat 的請求處理過程,之前也看過一些區域性的細節,【SpringBoot + Tomcat】【一】請求到達後端服務程序後的處理過程-聯結器的建立和執行、【SpringBoot + Tomcat】【二】請求到達後端服務程序後的處理過程-連線的處理細節,但是沒看完整,這節我們從整體看一下 Tomcat 從接收請求到最後到達 SpringMVC 的 DispatcherServlet 的過程。
另外參考我的兩篇,可以幫助你理解 DispatcherServlet 是如何注入到 Tomcat 的過程(本節不會講這個):【Spring MVC + Tomcat】Spring MVC 傳統VS現代方式的啟動過程對比、【Spring MVC + Tomcat】追本溯源,Spring MVC是如何和Tomcat關聯到一塊的呢?
2 整體一覽
我們先從整體的請求處理上,有一個全域性的概念:
一個 Tomcat 就是一個 Server 而一個 Server 裡可以有多個Service ,一個Service裡可以有多個 Connector 和 一個 Container(Container是個全稱,它內部包含 Engine、Host、Context、Wrapper)
請求過程大概分兩塊,一邊是 Connector 聯結器的範疇,一邊是 Container 範疇,中間透過 CyoteAdapter 將連線起裡的請求下發給右邊容器執行。容器執行採用的是責任鏈的方式:Pipline 表示整個責任鏈、Value 是每個鏈上的節點。
接下來,就從聯結器 Connector 到內部的協議處理器 ProtocolHandler 再到內部的連線點 Endpoint 再到 CyoteAdapter 將請求下發給 Container 來看一下,這裡以 HTTP/1.1為例,都是採用圖示哈,圖上的註釋應該比較清楚,就不做文字解釋了哈。
3 聯結器 Connector
3.1 例項化
3.2 初始化
3.3 啟動
4 協議處理器 ProtocolHandler
4.1 初始化
4.2 啟動
5 連線點 Endpoint
5.1 初始化
5.2 啟動
5.3 Accpet 執行緒
5.4 Poller 執行緒
5.5 執行緒池執行過程
圖有點大,截圖截不全,只好匯出哈。
6 CyoteAdapter 委派以及 Container 請求執行
7 小結
好啦,其實請求中的細節還有很多,包括超時處理,一些 Socket 關閉以及報錯處理可能在圖上沒嚴格表示出來還請理解一下,細節太多了哈哈= =,本節主要是看一下請求的經過的一些核心元件核心類的處理最後落點到 DispatcherServlet 的一條鏈路,有理解不對的地方還請指正哈。