【Tomcat 源碼系列】Tomcat 整體結構

一,前言

在開始看源碼細節之前,首先要想好要看的問題。想好問題之後,我們該如何尋找要看的代碼呢?

其實,這就好像去爬山的時候,突然想去上廁所,如果有一副地圖,那麼我們可以很快就找到廁所的位置。帶着問題看源碼也是同樣的道理,如果我們知道源碼每個部分的結構是做什麼的,那麼我們就可以很快定位代碼。

這篇博客主要介紹 Tomcat 的整體設計、源碼結構。

Tomcat 本質

Tomcat 本質上是什麼呢?我們上 Tomcat 的官網看看。下面這段來自官網,Tomcat 本質上就是實現了部分 Jakarta EE (Java EE 新的名字) 規範。我們日常使用中,一般都會說 Tomcat 是一個 Web 服務器,它可以處理 Http 相關的請求。因此,Tomcat 是一個實現了部分 Jakarta EE 規範的 Web 服務器。它有兩個主要的部分組成,一個是 Connector,一個是 Container。Connector 負責接收 Http 請求,並將請求轉發給 Container 去處理,Container 負責處理請求的內容,加載對應的 Servlet,將請求的結果返回給 Connector。

The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.

二,項目源碼結構

我們先從源碼結構開始。Tomcat 服務器相關的代碼在 java 文件夾下面,後面我們在進入這個文件夾去分析。

modules 文件夾下面,有四個部分。

三,Tomcat 源碼文件夾

Tomcat 源碼位於 java 文件夾下面。這個 java 文件夾下面的每個東西是幹什麼事情的呢?下面簡要說說。

1. Jakarta

位於 java/jakarta,這個文件夾下面保存的是新的 Java EE 規範,現在的 Java EE 也不這麼叫了,要改名叫 Jakarta EE。詳見這裡

如果去看 tomcat 9,會發現這個文件夾是 javax,不是 jakarta。tomcat 10 的一個重大轉變就是從 javax 命名空間轉向 jakarta。

每個規範是做什麼的呢?這裡參考官網[2]的規範簡要說說。

annotation

註解//jakarta.ee/specifications/annotations/2.0/annotations-spec-2.0.html#goals

下面引用了網頁中的說法,annotation 這個模塊的作用是定義了一些公用的註解,避免在不同的規範中定義相同的註解。

It is hoped that this will help to avoid unnecessary redundancy or duplication between annotations defined in different Jakarta EE specifications

ejb

Enterprise Beans//jakarta.ee/specifications/enterprise-beans/4.0/jakarta-enterprise-beans-spec-core-4.0.htm

EJB 是開發和部署基於組件的企業級應用的架構。EJB 是一個架構。我是第一次聽說 EJB,所以只能是引用它的說法,看個定義了。

The Enterprise Beans architecture is an architecture for the development and deployment of component-based business applications.

el

Expression Language//jakarta.ee/specifications/expression-language/4.0/jakarta-expression-language-spec-4.0.html

這個用在 jsp 中,用於求解表達式的值。

mail

無需看規範,知道它是郵件相關的就行。

persistence

持久化相關。

security

安全相關。

servlet

這個是重頭戲。從本質上說,tomcat 就是一個實現了 servlet 規範的一個容器。servlet 定義了服務端處理 Http 請求和響應的規範。

transaction

事務相關的接口。

websocket

定義了使用 websocket 協議的服務端和客戶端 API

xml.ws

定義了基於 SOAP 協議的 xml 方式的 web 服務。

2. org.apache

org/apache 文件夾下面是關於上面規範的部分實現。Tomcat 本質上就是 Jakarta EE 某些規範實現的合集。

Catalina

tomcat 的核心代碼,可以理解為一個 servlet 容器。

coyote

tomcat 的核心代碼,負責將網絡請求轉化後和 Catalina 進行通信。

el

上面的 Jakarta EE 中 el 的實現。

jasper

負責將 jsp 轉為 java 代碼。

juli

日誌相關的工具。

naming

命名空間相關。

tomcat

各種輔助工具,包括 websocket 的實現。

四,Tomcat 模塊設計

圖片來自於 Medium

簡化

How Tomcat Works 一書中,把 Tomcat 簡化為 Connector 和 Container。

Connector 負責接收 Http 請求,並將請求轉發給 Container 去處理,Container 負責處理請求的內容,加載對應的 Servlet,將請求的結果返回給 Connector。

五,總結

這篇文章從源碼層面,從設計層面介紹了 Tomcat 的整體結構。後面我們帶着問題逐個分析源碼,敬請期待。

有不懂的地方,也歡迎在評論區中交流討論。如有表述不準確的地方,希望能幫忙指出,謝謝~

參考鏈接

[1] //blogs.oracle.com/javamagazine/transition-from-java-ee-to-jakarta-ee

[2] //jakarta.ee/specifications/

[3] //medium.com/@nikhilmanikonda/tomcat-who-i-am-and-what-i-do-e91ff72fb2ea

Tags: