那天的面試現場,我腦袋突然空白
上週我去參加一家金融科技公司的 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 架構“家族圖”:
是不是突然清晰了?咱們把每個角色的職責再講清楚~
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 的通信模塊。
它的核心職責有兩個:
- 監聽端口、接收請求
- 把請求交給 Container 處理,並把響應寫回客户端
Tomcat 默認使用兩個常見的 Connector:
- HTTP/1.1 Connector:處理瀏覽器直接訪問的 HTTP 請求
- AJP Connector:用於和 Apache、Nginx 等前端服務器集
當請求到達 Connector 後,它不會自己去執行 Servlet,而是把請求交給 “後廚” Container。
比喻記憶:
Connector 就像服務員——點單、傳菜、送菜。
Container:真正處理請求的“後廚”
Container 是 Tomcat 中最重要的部分之一。它定義了 從接收請求到執行 Servlet 的全過程。
它內部有四層結構:
一層層關係就像這樣:
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 中的流轉路徑如下:
- Connector 接收請求:Coyote HTTP/1.1 Connector 在 8080 端口監聽到請求。
- 轉換成 Request/Response 對象:Coyote 把底層 Socket 封裝成標準請求對象。
- 交給 Engine 處理:Catalina 的 Engine 接收到請求。
- Host 匹配域名:找到對應的虛擬主機(如 localhost)。
- Context 匹配應用路徑:定位到 /demo 這個 web 應用。
- Wrapper 匹配 Servlet:找到 /hello 對應的 Servlet 並執行。
- Servlet 執行業務邏輯,生成響應:把結果返回到 Response。
- 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歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!