Tomcat對Apache MPM模型的實現
Tomcat 和 Apache MPM 的簡介
Tomcat 簡介
Tomcat 是一個免費的開源 Servlet 容器,它是 Apache 基金會的 Jakarta 項目中的核心項目,最近 Sun 也參與到其的開發中,并將它集成到 NetBeans 中。由于有了 Sun 的支持,最新的 Servlet 和 Jsp 規范在 Tomcat 中得到體現。
目前
Tomcat
最新版本是
1.???????? 支持 web 應用程序的靜態配置和動態配置。
2.???????? 內置一個管理 Tomcat 的 web 應用程序。方便對 Tomcat 的日常管理。
3.???????? 提供 Realm 支持, Realm 是一些帶角色的用戶信息。 Tomcat 通過驗證這些信息來限制用戶對一些 web 應用程序的訪問。 Realm 類似于 unix 中組的概念。 Tomcat 主要支持 JDBCRealm , DataSourceRealm, JNDIRealm, MemoryRealm, JAASRealm 。這幾種 Realm 。
4.???????? 提供 JNDI 支持。
5.???????? 通過 DBCP 或第三方庫提供 JDBC 數據源。
6.???????? 實現獨立類加載體系,以防 web 應用程序的類庫與 Tomcat 自身類庫沖突。
7.???????? 集成 SSL ,實現安全傳輸。
8.???????? 使用 JMX MBeans 進行組件的管理。
9.???????? 支持集群。實現負載均衡。
10.???? 多種日志支持。
???
Apache MPM 簡介
MPM( Multi-Processing Modules ) 多道處理模塊 , 在支持 POSIX 線程的 Unix 系統上, Apache 可以通過不同的 MPM 運行在一種多進程與多線程相混合的模式下來處理 Http 請求, MPM 模塊是 Apache2.0 的核心模塊。
如果不用 “--with-mpm” 顯式指定某種 MPM , prefork 就是 Unix 平臺上缺省的 MPM 。它所采用的預派生子進程方式也是 Apache 1.3 中采用的模式。 prefork 本身并沒有使用到線程, 2.0 版使用它是為了與 1.3 版保持兼容性;另一方面, prefork 用單獨的子進程來處理不同的請求,進程之間是彼此獨立的,這也使其成為最穩定的 MPM 之一。
相對于
prefork
,
worker
是
2.0
版中全新的支持多線程和多進程混合模型的
MPM
。由于使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小于基于進程的服務器。但是,
worker
也使用了多進程,每個進程又生成多個線程,以獲得基于進程服務器的穩定性。這種
MPM
的工作方式將是
Apache 2.0
的發展趨勢。
Tomcat 對 MPM 的實現架構
Tomcat 對 MPM 的實現源碼分析
1.???????? 首先 PoolTcpEndpoint 調用 startEndpoint() 方法開始執行 MPM 的核心代碼
代碼
:
2.????????
調用
PoolTcpEndpoint
的
initEndpoint()
方法完成
PoolTcpEndpoint
的初始化
.
3.????????
PoolTcpEndpoint
調用
ThreadPool
的
start()
方法,完成
ThreadPool
的初始化
代碼
:
4.????????
調用
ThreadPool
的
runIt()
方法,開始監聽線程
5.???????? 監聽線程調用 LeaderFollowerWorkerThread 的 runIt() 方法監聽鏈接,在得到一個鏈接后該監聽線程處理該鏈接,并從 ThreadPool 里取一個新的線程運行監聽程序,監聽新的鏈接。
???
總結
MPM 是一個成熟的多道任務處理模型, Tomcat 很好的實現了這個模型,提高了 Tomcat 的性能。希望這篇文檔對研究 MPM 的兄弟有所幫助。