Tomcat8源碼分析-架構及說明

上一篇: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 &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

能夠看到和架構圖示同樣的結構,也另外一個角度證實上圖的正確性。

看到這些server.xml中的標籤名稱,有看過源碼經驗的話,能夠猜測在Tomcat中也應該有相似的接口或者類,好比Server Service Engine Host等等

從上圖中配置的信息來看,開發者應該能夠經過添加Listener或者Valve來影響Tomcat的運行,先留在這裏,等後面寫實例來測試一下,也就是它們是提供給開發者或者使用者的擴展點。固然開發者也能夠修改源代碼達到這樣的效果(不推薦),我的認爲除非大公司或者技術大牛想新搞一個版本出來。

 

上面從server.xml來證實架構,下一篇再來看看Tomcat的類結構圖和DEBUG時的關聯關係來驗證架構

下一篇:Tomcat8源碼分析-類結構圖

相關文章
相關標籤/搜索