Tomcat整體結構
設計模式
Tomcat 的心臟是兩個組件:Connector 和 Container,一個 Container 能夠選擇對應多個 Connector。多個Connector 和一個 Container 就造成了一個 Service,有了 Service 就能夠對外提供服務了,可是 Service 還要一個生存的環境,必需要有人可以給她生命、掌握其生死大權,那就非 Server 莫屬了。因此整個 Tomcat 的生命週期由 Server 控制。 Service 對於connector和container的關係: Tomcat 中 Connector、Container 做爲一個總體比做一對情侶的話,Connector 主要負責對外交流,能夠比做爲 Boy,Container 主要處理 Connector 接受的請求,主要是處理內部事務,能夠比做爲 Girl。那麼這個 Service就是鏈接這對男女的結婚證了。是 Service 將它們鏈接在一塊兒,共同組成一個家庭。固然要組成一個家庭還要不少其它的元素。 Service 只是在 Connector 和 Container 外面多包一層,把它們組裝在一塊兒,向外面提供服務,一個 Service 能夠設置多個Connector,可是隻能有一個 Container 容器 Service接口 Tomcat 中 Service 接口的標準實現類是 StandardService 它不只實現了 Service 接口同時還實現了 Lifecycle 接口,這樣它就能夠控制它下面的組件的生命週期 StandardService. SetContainer: 先判斷當前的這個 Service 有沒有已經關聯了 Container,若是已經關聯了,那麼去掉這個關聯關係—— oldContainer.setService(null)。若是這個 oldContainer 已經被啓動了,結束它的生命週期。而後再替換新的關聯、再初始化並開始這個新的 Container 的生命週期。最後將這個過程通知感興趣的事件監聽程序 StandardService. addConnector: 首先是設置關聯關係,而後是初始化工做,開始新的生命週期 以Server爲「居」 Server 要完成的任務很簡單,就是要可以提供一個接口讓其它程序可以訪問到這個 Service 集合、同時要維護它所包含的全部 Service 的生命週期,包括如何初始化、如何結束服務、如何找到別人要訪問的 Service 組件的生命線「Lifecycle」 tomcat 中組件的生命週期是經過 Lifecycle 接口來控制的,組件只要繼承這個接口並實現其中的方法就能夠統一被擁有它的組件控制了,這樣一層一層的直到一個最高級的組件就能夠控制 Tomcat 中全部組件的生命週期,這個最高的組件就是 Server,而控制 Server 的是 Startup,也就是啓動和關閉 Tomcat。 Lifecycle 接口的方法的實現都在其它組件中,就像前面中說的,組件的生命週期由包含它的父組件控制,因此它的 Start 方法天然就是調用它下面的組件的 Start 方法,Stop 方法也是同樣。如在 Server 中 Start 方法就會調用 Service 組件的 Start 方法,監聽的代碼會包圍 Service 組件的啓動過程,就是簡單的循環啓動全部 Service 組件的 Start 方法 Connector 組件 Connector 組件是 Tomcat 中兩個核心組件之一,它的主要任務是負責接收瀏覽器的發過來的 tcp 鏈接請求,建立一個 Request 和 Response 對象分別用於和請求端交換數據,而後會產生一個線程來處理這個請求並把產生的 Request 和 Response 對象傳給處理這個請求的線程,處理這個請求的線程就是 Container 組件要作的事了。 Connector 最重要的功能就是接收鏈接請求而後分配線程讓 Container 來處理這個請求,因此這必然是多線程的,多線程的處理是 Connector 設計的核心 Servlet 容器「Container」 Container 是容器的父接口,全部子容器都必須實現這個接口,Container 容器的設計用的是典型的責任鏈的設計模式,它有四個子容器組件構成,分別是:Engine、Host、Context、Wrapper,這四個組件不是平行的,而是父子關係,Engine 包含Host,Host 包含 Context,Context 包含 Wrapper Tomcat 中其它組件 Tomcat 還有其它重要的組件,如安全組件 security、logger 日誌組件、session、mbeans、naming 等其它組件。這些組件共同爲 Connector 和 Container 提供必要的服務。