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