上一篇:Idea中構建Tomcat8源碼開發環境web
Tomcat都用不少年了,歷來也沒仔細對他研究過,平時也就會動動Server.xml中的Connector或者Context配置,在控制檯修改一下線程數,改改JVM參數什麼的。不曾想過是否能夠本身編寫一段代碼影響Tomcat的行爲,這就須要瞭解Tomcat提供的擴展點。面試
經過本次閱讀Tomcat源碼但願達到以下幾種效果apache
1.它的設計思想設計模式
2.使用了那些設計模式瀏覽器
3.Tomcat初始化流程tomcat
4.Tomcat啓動流程架構
5.Tomcat處理請求的流程app
6.Tomcat提供了那些擴展點能夠影響其行爲webapp
開始閱讀源碼以前,得先作如下幾手準備:
1.至少得使用一下Tomcat如何使用,瞭解從瀏覽器發出請求-Tomcat接受請求-Servlet處理請求-返回Response-瀏覽器拿到返回值進行渲染這個流程源碼分析
2.去Google或者百度看看Tomcat架構的文章,對其有初步的瞭解,會給後來看源碼有很大的幫助,效率能提升不少。
推薦一下這個博客:四張圖帶你瞭解Tomcat系統架構--讓面試官顫抖的Tomcat回答系列!
3.瀏覽一下Tomcat的官方文檔
以上準備工做都作完以後,經過閱讀源碼和查看配置文件,本身也畫了一份頂層架構圖
說明:Tomcat只有一個Server,它包含多個Service,而Service包含了多種Connector和一個(惟一的)Engine(Container),Engine包含多個Host,一個Host包含多個Context,一個Context包含多個Wrapper。
Server:就是整個Tomcat,它包含了全部組件,它由解析器解析server.xml而獲得的。
Service:是Server用於提供具體服務的,能夠有多個Service。就比如銀行辦事大廳是一個Server,各個櫃檯是一個Service,用戶在窗口前排隊進行任務處理,Server爲Service提供其餘資源的保障。
Connector:有多種,負責接收請求,並將請求繼續往下傳遞,直到Container處理完並返回,再由它返回給客戶端。默認有Http和AJP協議類型的Connector
Host\Context 看下圖理解更容易,不須要文字描述
Wrapper:能夠理解爲咱們的Servlet。
看了上面的圖,再拿平時接觸到過的server.xml文件看看結構
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
能夠看到和架構圖示同樣的結構,也另外一個角度證實上圖的正確性。
看到這些server.xml中的標籤名稱,有看過源碼經驗的話,能夠猜測在Tomcat中也應該有相似的接口或者類,好比Server Service Engine Host等等
從上圖中配置的信息來看,開發者應該能夠經過添加Listener或者Valve來影響Tomcat的運行,先留在這裏,等後面寫實例來測試一下,也就是它們是提供給開發者或者使用者的擴展點。固然開發者也能夠修改源代碼達到這樣的效果(不推薦),我的認爲除非大公司或者技術大牛想新搞一個版本出來。
上面從server.xml來證實架構,下一篇再來看看Tomcat的類結構圖和DEBUG時的關聯關係來驗證架構
下一篇:Tomcat8源碼分析-類結構圖