Tomcat总体架构
目錄
?
總體設計
Server
Container
Service
Context
Host
Wrapper
Lifecyle
Pipe和Valve
Connector
Tomcat啟動
請求處理
類加載器
J2SE標準類加載器
Tomcat加載器
總體設計
從最基本的功能來,服務器可以描述為:接收請求并進行解析,完成相關業務處理,返回結果。
Server
上帝類,完成socket監聽,處理請求并相應。
請求與處理方到一起,擴展性差,拆開
============>>>>>>
Container
一個Server包含多個Connector和Container。Connector負責監聽,Container負責處理。
如何知曉Connector與Container關系呢?增加映射。
============>>>>>>
Service
增加Service,維護多個Connector與1個Container。
Server中可以包含多個Service(相互獨立,共享一個JVM以及系統類庫)。
Engine表示真個Servlet引擎,而非Servlet容器。表示整個Servlet容器的是Server。引擎僅考慮處理請求。
?Engine需要Web應用來處理請求,增加Web應用。
============>>>>>>
Context
Web應用以Context表示,一個Engine可以包含多個Context。
如果一個服務器可以承擔多個域名服務怎么辦呢?增加Host。
============>>>>>>
Host
Host表示虛擬主機,一個Host可以包含多個Context。
Servlet規范,一個Web應用可以包含多個Servlet實例,因此增加Wrapper。
============>>>>>>
Wrapper
Engine,Host,Context,Wrapper都是容器的表現形式,增加Container
============>>>>>>
容器之間的關系是弱引用的關系,通過Container的父子容器概念體現,因此之間關系是聚合。
?
所有組件都有啟動,停止等方法,具有生命周期。
============>>>>>>
Lifecyle
每個生命周期方法,都會導致狀態的轉換,但是并不是每個狀態都會觸發生命周期事件,也不是每個生命周期事件都存在對應狀態。
| 方法 | 狀態 | 生命周期事件 |
| init() | INITIALIZING | BEFORE_INIT_EVENT |
| INITIALIZED | AFTER_INIT_EVENT | |
| start() | STARTING_PREP | BEFORE_START_EVENT |
| STARTING | START_EVENT | |
| STARTED | AFTER_START_EVENT | |
| stop() | STOPPING_PREP | BEFORE_STOP_EVENT |
| STOPPING | STOP_EVENT | |
| STOPPED | AFTER_STOP_EVENT | |
| destroy() | DESTROYING | BEFORE_DESTROY_EVENT |
| DESTROYED | AFTER_DESTROY_EVENT | |
| ? | ? | PERIODIC_EVENT |
| ? | ? | CONFIGURE_START_EVENT |
| ? | ? | CONFIGURE_STOP_EVENT |
PERIODIC_EVENT:周期性事件,每次調用后觸發。
增強組件的靈活性與可擴展性。
============>>>>>>
Pipe和Valve
采用責任鏈來增強靈活性與擴展性。PipeLine用于構造責任鏈,Valve代表責任鏈中的每個處理器。
Connector
要想與Container配合實現一個完整的功能,Connector需要實現以下幾種功能:
- 監聽請求
- 請求解析
- 匹配容器
- 返回相應
ProtocolHandler表示一個協議處理器,包含一個AbstractEndPoint監聽端口,還包含一個Processor處理指定協議,按照請求映射到具體的容器。
映射的過程叫請求映射,要考慮組件的注冊與銷毀,由Mapper維護映射信息,MapperListener負責注冊與注銷映射信息。
Tomcat使用適配器模式實現Connector與Mapper,Container的解耦。
?
Tomcat啟動
Tomcat啟動過程非常標準化,統一按照生命周期管理接口Lifecyle的定義進行啟動,調用init()方法進行組件的逐級初始化,然后再調用start()方法進行啟動,每次調用都伴隨生命周期狀態變更事件的觸發。
請求處理
類加載器
J2SE標準類加載器
- Bootstrap ClassLoader
加載<JAVA_HOME>\lib,或者被-Xbootclasspath參數所指定的路徑中的類庫,啟動類加載器無法被Java程序直接引用。
- Extension ClassLoader
加載<JAVA_HOME>\lib\ext下的類庫,開發者可以直接使用擴展類加載器
- Application ClassLoader
Tomcat加載器
?
tomcat自定義了4種類加載器,分別是
- commonClassLoader
路徑為common.loader,默認指向$CATALINA_HOME\lib
- catalinaClassLoader
路徑server.loader,默認為空,使用CommonClassLoader
- sharedClassLoader
所有Web應用的父加載類,路徑shared.loader,默認為空,使用CommonClassLoader
- webappClassLoader
加載/WEB-INF/classes和/WEB-INF/lib下的類或包,僅對當前WEB可見
?
?
因為tomcat對于catalinaClassLoader和sharedClassLoader的默認設置是類路徑為空,因此catalinaClassLoader和sharedClassLoader就跟commonClassLoader一樣了,即tomcat默認設置下commonClassLoader 、catalinaClassLoader和sharedClassLoader這3個類加載器是同一個。webappClassLoader相當于每個部署在tomcat中的應用的類加載器,有多少個應用就有多少個獨立的webappClassLoader,因此,tomcat的類加載器結構如下:
?
?
?
總結
以上是生活随笔為你收集整理的Tomcat总体架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring--Resource
- 下一篇: CIDR地址块及其子网划分