那天的面試現場,我腦袋突然空白

上週我去參加一家金融科技公司的 Java 高級開發面試。一切都挺順利,Redis、JVM、Spring 全答得順風順水。

直到面試官輕輕一笑,説了一句:

“那我們來聊聊 Tomcat 吧,説説你對它的頂層架構理解?”

當場我腦子“嗡”的一聲:

——Tomcat 架構?我只記得 Catalina、Coyote、Connector……那它們到底誰是誰爹?!

我硬着頭皮扯了幾句,然後在回家路上一路反思:

Tomcat 的架構我天天在用,怎麼就講不明白?

於是我花了一整個週末,啃源碼、畫圖、看官方架構圖。今天就用我這幾天的“血淚筆記”,幫你徹底搞懂 Tomcat 的頂層架構。(看完這篇,保你再也不會在面試時“嗡”地一聲了!)

先來一個故事:Tomcat 就像一個餐廳

我們先別管那些 “Catalina”、“Coyote”、“Container” 這些名詞。先想象這樣一個場景:

一家高檔餐廳,門口有接待員(Connector),廚房裏有主廚團隊(Container),後台還有個大管家負責統籌調度(Catalina)。

Tomcat 就是這樣一個餐廳系統。

  • Connector(連接器):就像餐廳門口的接待員,負責接客(接收請求)和送菜(返回響應)。
  • Container(容器):就是後廚,真正“烹飪”請求的地方。它裏面有四層廚房:Engine、Host、Context、Wrapper,每層分工明確。
  • Catalina(核心引擎):就是餐廳的大管家。它負責整個餐廳的啓動、關閉、協調各部門運作。

當你啓動 Tomcat 時,其實就是 Catalina 啓動了一個 Server,Server 包含多個 Service,每個 Service 下面又有 Connector + Container 的搭配。

Tomcat 架構的“家譜圖”

我們來看看真正的 Tomcat 架構“家族圖”:

Java 面試高頻題:Tomcat 頂層架構怎麼答?看完這篇直接揹走滿分答案!_HTTP

是不是突然清晰了?咱們把每個角色的職責再講清楚~

Server:Tomcat 的“總指揮”

Tomcat 啓動時,最頂層的對象叫 Server

  • 它代表整個 Tomcat 實例(就像一個完整的餐廳系統)。
  • Server 負責管理所有的 Service
  • 當你執行 shutdown 命令時,其實就是讓 Server 關閉所有 Service,優雅停機。

面試回答示例:

Tomcat 的最頂層組件是 Server,它代表整個服務器實例,用於管理多個 Service 的生命週期。

Service:連接器與容器的橋樑

Service 是連接前台和後廚的橋樑。

  • 每個 Service 由 一個或多個 Connector一個 Container 組成。
  • Connector 負責接收請求,Container 負責處理。
  • 這樣可以支持多個協議:例如 HTTP、AJP(Tomcat 用於和 Apache 通信的協議)。

一句話記憶:

Service 是“前台+後廚”的一套組合,Connector 進菜,Container 做菜。

Connector:請求的“接待員”

Connector 也叫 Coyote(郊狼),是 Tomcat 的通信模塊。

它的核心職責有兩個:

  1. 監聽端口、接收請求
  2. 把請求交給 Container 處理,並把響應寫回客户端

Tomcat 默認使用兩個常見的 Connector:

  • HTTP/1.1 Connector:處理瀏覽器直接訪問的 HTTP 請求
  • AJP Connector:用於和 Apache、Nginx 等前端服務器集

當請求到達 Connector 後,它不會自己去執行 Servlet,而是把請求交給 “後廚” Container。

比喻記憶:

Connector 就像服務員——點單、傳菜、送菜。

Container:真正處理請求的“後廚”

Container 是 Tomcat 中最重要的部分之一。它定義了 從接收請求到執行 Servlet 的全過程。

它內部有四層結構:

Java 面試高頻題:Tomcat 頂層架構怎麼答?看完這篇直接揹走滿分答案!_HTTP_02

一層層關係就像這樣:

Engine(大廚房)→ Host(每個餐廳分店)→ Context(每個菜系)→ Wrapper(具體廚師)

當請求從 Connector 傳過來時,它會一層層往下傳遞,直到找到對應的 Servlet 執行。

Catalina:Tomcat 的靈魂人物

前面我們説 Catalina 是“大管家”,其實它是 Tomcat 的核心引擎。

Catalina 的主要職責包括:

  • 解析配置文件 server.xml
  • 創建並啓動 Server、Service、Connector、Container
  • 管理 Tomcat 的生命週期(啓動、暫停、關閉)
  • 加載和管理 Web 應用

換句話説,Catalina 是 Tomcat 架構的靈魂。沒有它,整個系統都無法啓動。

Coyote:Connector 的內核

Coyote 是 Tomcat 網絡通信的實現模塊。它是 Connector 的底層實現,支持多種協議(HTTP/1.1、HTTP/2、AJP、WebSocket 等)。

Coyote 會把底層 Socket 流包裝成一個標準的 Request/Response 對象,然後交給上層的 Catalina 去處理。

讓我們跟着一個請求走一遍

假設你在瀏覽器輸入:

http://localhost:8080/demo/hello

這個請求在 Tomcat 中的流轉路徑如下:

  1. Connector 接收請求:Coyote HTTP/1.1 Connector 在 8080 端口監聽到請求。
  2. 轉換成 Request/Response 對象:Coyote 把底層 Socket 封裝成標準請求對象。
  3. 交給 Engine 處理:Catalina 的 Engine 接收到請求。
  4. Host 匹配域名:找到對應的虛擬主機(如 localhost)。
  5. Context 匹配應用路徑:定位到 /demo 這個 web 應用。
  6. Wrapper 匹配 Servlet:找到 /hello 對應的 Servlet 並執行。
  7. Servlet 執行業務邏輯,生成響應:把結果返回到 Response。
  8. Connector 把響應發送回瀏覽器

一個完整的請求-響應流程就這樣走完了。是不是瞬間清晰了?

Tomcat 架構總結口訣

面試前背熟這幾句話:

Catalina 掌管全局,Server 服務整合。

Service 連接前後,Connector 接收傳達。

Container 層層遞進,Engine 主控中樞。

Host 管站點,Context 管應用,Wrapper 管 Servlet。

Coyote 傳輸協議,Catalina 執行核心。

面試官可能追問的問題(附答案)

Q1:Tomcat 支持多協議是怎麼做到的?

通過在一個 Service 中配置多個 Connector(例如 HTTP、AJP),它們共用同一個 Container。

Q2:Tomcat 是如何找到對應 Servlet 的?

通過 Container 層層匹配:Engine → Host → Context → Wrapper,最終根據 URL pattern 找到對應 Servlet。

Q3:Tomcat 中的 Pipeline 和 Valve 是幹嘛的?

它是責任鏈模式實現的請求處理管道,每一層 Container 都有自己的 Valve(類似攔截器),可實現日誌、鑑權等功能。

Q4:Catalina 與 Coyote 的關係?

Coyote 是通信層(處理協議、IO),Catalina 是業務層(處理 Servlet 調度)。

寫在最後:理解架構,才能真正“馴服”Tomcat

當我重新看完 Tomcat 架構圖那一刻,我突然想明白一件事:

Tomcat 從來不只是一個 Servlet 容器,它是一套精妙的系統工程。每一層都有清晰的職責,每個模塊都能獨立擴展、替換。

這種解耦的設計思想,才是 Java 架構師最該學的部分。所以,如果下一次面試官再問你——

“能講講 Tomcat 的頂層架構嗎?”

請你微笑着説:

“Tomcat 的核心分為 Catalina(容器引擎)和 Coyote(通信組件)。頂層是 Server,內部由多個 Service 組成,Service 由 Connector + Container 構成。Container 再分為 Engine、Host、Context、Wrapper 四層結構,共同實現請求到 Servlet 執行的全過程。”

這一刻,輪到面試官“嗡”的一聲了!

END

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!