首先dowload源碼並導入到Eclipse中,導入后代碼代碼的層次如下圖所示。先簡單來看下tomcat源碼的結構。javax這個包主要是有關JavaEE規范的,比如Servlet等等,並不是我們主要分析的。需要分析有org.apache下的子包,其中catalina中很重要,其中tomcat的啟動就在該包下中的startup包下,
catalina下還定義了tomcat容器(server,service,engine,host,context)的接口。其中對接口的實現也在該包下,org.apache.catalina.core下。包括tomcat管道機制,各個wraper的實現也在這個包下,因此這也是tomcat最為核心東一個包。
我們再來看下connector,見名知意,這個包是負責處理請求的,最終請求會進入到這個包下的CoyoteAdapter中service方法來處理。
我們繼續來說下coyote這個包,這個包偏底層一些,其會對socket傳輸來的數據進行包裝,然后再轉給實現來Adapter接口的類,其中具體實現也是由catalina下的CoyoteAdapter來實現,這個包下主要是對TCP/IP傳輸來東數據進行處理,其由兩種實現方式,一種是采用ajp協議,另外一種則是采用http協議,簡單來說,這個包就是把TCP/IP(通過Socket)層傳輸來的對象進行包裝,包裝為ajp或者http的對象,然后轉發到catalina下的connector中進行處理。
接下來我們簡單對tomcat這個包做下分析,其中核心在於util包下,其中threads包下是tomcat對線程池做了自己的擴展(在Executor框架基礎上)。其中最核心的地方在於net包下,這個包是真正來出來網絡的,即請求過來會首先來到這個包下(注意:現在還是處於TCP/IP層面上並沒有到來http層面),其中JIOEndpoint也是由我們核心去分析的,該類是實際處理Socket請求,其中如何接受請求並將請求轉到工作線程去處理都是在這個包下來實現。
說完了tomcat的代碼package組織,我們繼續來看看Tomcat的架構圖,下圖是我從網上搜到的一幅架構圖,基本能完整的說明其架構。
我們開始詳細來說明一下Tomcat的各個結構。在這張架構圖中我們看到了tomcat的容器機構,其最大的容器為server,server下包含1至N個service容器,service容器下又包含1至N個Engine容器,Engine容器下則包含1至N個Host容器(Host即對應我們的域名),同樣,Host容器則包含1至N個Context容器(Context也就是我們通常的JavaWeb應用)。在實際生成環境中,我們通常只會有一個Server容器,一個Service容器,一個Engine容器,但經常會有多個Host容器,多個Context容器(往往也是一個Host下只有一個Context),尤其是在分布式的環境下,往往是多個Host容器。在這里還要特殊說明一下Connector,Connector是在Service容器之中,tomcat默認會配置兩個Connector,一個Connector是負責處理http協議,另一個Connector則是負責處理tomcat自身的一種協議ajp,后續我們會對http協議的Connector作為詳細闡述。
凡是用過Tomcat的開發者一定也會對tomcat下conf文件夾中的server.xml文件有一定的了解。其server.xml大致如下。其中server.xml的最大的父節點是server,該server其接口規范是由org.apache.catalina.Server這個接口定義,其具體實現由org.apache.catalina.core.StandardServer實現,在后續的文章中我們會對其進行具體闡述。同理,Engine、Host、Context容器也在org.apache.catalina該包下有其特定的接口規范,其實現都在org.apache.catalina.core這個包下。
下一節我們會對Tomcat的父子容器進行具體的闡述。