總體結構
tomcat 的結構很複雜,但是 tomcat 也非常的模組化,找到了 tomcat 最核心的模組,您就抓住了 tomcat 的「七寸」。下面是 tomcat 的總體結構圖:
從 上圖中可以看出 tomcat 的心臟是兩個元件:connector 和 container,關於這兩個元件將在後面詳細介紹。connector 元件是可以被替換,這樣可以提供給伺服器設計者更多的選擇,因為這個元件是如此重要,不僅跟伺服器的設計的本身,而且和不同的應用場景也十分相關,所以一 個 container 可以選擇對應多個 connector。多個 connector 和乙個 container 就形成了乙個 service,service 的概念大家都很熟悉了,有了 service 就可以對外提供服務了,但是 service 還要乙個生存的環境,必須要有人能夠給她生命、掌握其生死大權,那就非 server 莫屬了。所以整個 tomcat 的生命週期由 server 控制。
以service作為「婚姻」
我們將 tomcat 中 connector、container 作為乙個整體比作一對情侶的話,connector 主要負責對外交流,可以比作為 boy,container 主要處理 connector 接受的請求,主要是處理內部事務,可以比作為 girl。那麼這個 service 就是連線這對男女的結婚證了。是 service 將它們連線在一起,共同組成乙個家庭。當然要組成乙個家庭還要很多其它的元素。
說白 了,service 只是在 connector 和 container 外面多包一層,把它們組裝在一起,向外面提供服務,乙個 service 可以設定多個 connector,但是只能有乙個 container 容器。這個 service 介面的方法列表如下:
從 service 介面中定義的方法中可以看出,它主要是為了關聯 connector 和 container,同時會初始化它下面的其它元件,注意介面中它並沒有規定一定要控制它下面的元件的生命週期。所有元件的生命週期在乙個 lifecycle 的介面中控制,這裡用到了乙個重要的設計模式,關於這個介面將在後面介紹。
tomcat 中 service 介面的標準實現類是 standardservice 它不僅實現了 service 藉口同時還實現了 lifecycle 介面,這樣它就可以控制它下面的元件的生命週期了。standardservice 類結構圖如下:
從 上圖中可以看出除了 service 介面的方法的實現以及控制項生命週期的 lifecycle 介面的實現,還有幾個方法是用於在事件監聽的方法的實現,不僅是這個 service 元件,tomcat 中其它元件也同樣有這幾個方法,這也是乙個典型的設計模式,將在後面介紹。
下面看一下 standardservice 中主要的幾個方法實現的**,下面是 setcontainer 和 addconnector 方法的原始碼:
public void setcontainer(container container) catch (lifecycleexception e)
}synchronized (connectors)
if (started && (oldcontainer != null) && (oldcontainer instanceof lifecycle)) catch (lifecycleexception e)
}support.firepropertychange("container", oldcontainer, this.container);
}這段**很簡單,其實就是先判斷當前的這個 service 有沒有已經關聯了 container,如果已經關聯了,那麼去掉這個關聯關係—— oldcontainer.setservice(null)。如果這個 oldcontainer 已經被啟動了,結束它的生命週期。然後再替換新的關聯、再初始化並開始這個新的 container 的生命週期。最後將這個過程通知感興趣的事件監聽程式。這裡值得注意的地方就是,修改 container 時要將新的 container 關聯到每個 connector,還好 container 和 connector 沒有雙向關聯,不然這個關聯關係將會很難維護。
public void addconnector(connector connector) catch (lifecycleexception e)
}if (started && (connector instanceof lifecycle)) catch (lifecycleexception e)
}support.firepropertychange("connector", null, connector);}}
上面是 addconnector 方法,這個方法也很簡單,首先是設定關聯關係,然後是初始化工作,開始新的生命週期。這裡值得一提的是,注意 connector 用的是陣列而不是 list 集合,這個從效能角度考慮可以理解,有趣的是這裡用了陣列但是並沒有向我們平常那樣,一開始就分配乙個固定大小的陣列,它這裡的實現機制是:重新建立乙個 當前大小的陣列物件,然後將原來的陣列物件 copy 到新的陣列中,這種方式實現了類似的動態陣列的功能,這種實現方式,值得我們以後拿來借鑑。
最新的 tomcat6 中 standardservice 也基本沒有變化,但是從 tomcat5 開始 service、server 和容器類都繼承了 mbeanregistration 介面,mbeans 的管理更加合理。
Tomcat工作原理
tomcat內存在乙個process連線池,有請求過來會去連線池內獲取process物件對該請求進行處理,連線池有最小連線數和最大連線數,當前請求數超過最大連線數後超出的連線請求將會被丟棄,如果最大連線數設定為負數,則表示無最大連線數限制。乙個process物件接收到請求後不對請求做任何處理,直接建...
Tomcat工作原理
engine容器 engine 容器比較簡單,它只定義了一些基本的關聯關係,介面類圖如下 它的標準實現類是 standardengine,這個類注意一點就是 engine 沒有父容器了,如果呼叫 setparent 方法時將會報錯。新增子容器也只能是 host 型別的,如下 public void ...
Tomcat工作原理
一 apache tomcat方式 配置檔案 server.xml 主要配置項 1 server server port 8005 shutdown shutdown server 指定8005埠,監聽關閉tomcat進行的請求。2 connector 共兩個,定義客戶端和伺服器之間的連線。獲取客戶...