欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
TOMCAT源碼分析(啟動(dòng)框架) :: 珊瑚島
TOMCAT源碼分析(啟動(dòng)框架)

ThomasHuang [原作]

前言:
   本文是我閱讀了TOMCAT源碼后的一些心得。 主要是講解TOMCAT的系統框架, 以及啟動(dòng)流程。若有錯漏之處,敬請批評指教!
建議:
   畢竟TOMCAT的框架還是比較復雜的, 單是從文字上理解, 是不那么容易掌握TOMCAT的框架的。 所以得實(shí)踐、實(shí)踐、再實(shí)踐。 建議下載一份TOMCAT的源碼, 調試通過(guò), 然后單步跟蹤其啟動(dòng)過(guò)程。 如果有不明白的地方, 再來(lái)查閱本文, 看是否能得到幫助。 我相信這樣效果以及學(xué)習速度都會(huì )好很多!
  
1. Tomcat的整體框架結構
   Tomcat的基本框架, 分為4個(gè)層次。
   Top Level Elements:
    Server
    Service  
   Connector
    HTTP
    AJP
   Container
   Engine
     Host
   Context
   Component 
    manager
   logger
   loader
   pipeline
   valve
         ...
   站在框架的頂層的是Server和Service
   Server:  其實(shí)就是BackGroud程序, 在Tomcat里面的Server的用處是啟動(dòng)和監聽(tīng)服務(wù)端事件(諸如重啟、關(guān)閉等命令。 在tomcat的標準配置文件:server.xml里面, 我們可以看到“<Server port="8005" shutdown="SHUTDOWN" debug="0">”這里的"SHUTDOWN"就是server在監聽(tīng)服務(wù)端事件的時(shí)候所使用的命令字)
   Service: 在tomcat里面, service是指一類(lèi)問(wèn)題的解決方案。  通常我們會(huì )默認使用tomcat提供的:Tomcat-Standalone 模式的service。 在這種方式下的service既給我們提供解析jsp和servlet的服務(wù), 同時(shí)也提供給我們解析靜態(tài)文本的服務(wù)。
  
   Connector: Tomcat都是在容器里面處理問(wèn)題的, 而容器又到哪里去取得輸入信息呢?
Connector就是專(zhuān)干這個(gè)的。 他會(huì )把從socket傳遞過(guò)來(lái)的數據, 封裝成Request, 傳遞給容器來(lái)處理。
   通常我們會(huì )用到兩種Connector,一種叫http connectoer, 用來(lái)傳遞http需求的。 另一種叫AJP, 在我們整合apache與tomcat工作的時(shí)候, apache與tomcat之間就是通過(guò)這個(gè)協(xié)議來(lái)互動(dòng)的。 (說(shuō)到apache與tomcat的整合工作, 通常我們的目的是為了讓apache 獲取靜態(tài)資源, 而讓tomcat來(lái)解析動(dòng)態(tài)的jsp或者servlet。)
   Container: 當http connector把需求傳遞給頂級的container: Engin的時(shí)候, 我們的視線(xiàn)就應該移動(dòng)到Container這個(gè)層面來(lái)了。
   在Container這個(gè)層, 我們包含了3種容器: Engin, Host, Context.
   Engin: 收到service傳遞過(guò)來(lái)的需求, 處理后, 將結果返回給service( service 是通過(guò) connector 這個(gè)媒介來(lái)和Engin互動(dòng)的 ).
   Host: Engin收到service傳遞過(guò)來(lái)的需求后,不會(huì )自己處理, 而是交給合適的Host來(lái)處理。
Host在這里就是虛擬主機的意思, 通常我們都只會(huì )使用一個(gè)主機,既“localhost”本地機來(lái)處理。
   Context: Host接到了從Host傳過(guò)來(lái)的需求后, 也不會(huì )自己處理, 而是交給合適的Context來(lái)處理。
   比如: <http://127.0.0.1:8080/foo/index.jsp>
         <http://127.0.1:8080/bar/index.jsp>
   前者交給foo這個(gè)Context來(lái)處理, 后者交給bar這個(gè)Context來(lái)處理。
   很明顯吧! context的意思其實(shí)就是一個(gè)web app的意思。
   我們通常都會(huì )在server.xml里面做這樣的配置
   <Context path="/foo" docBase="D:/project/foo/web" />
   這個(gè)context容器,就是用來(lái)干我們該干的事兒的地方的。
  
   Compenent: 接下來(lái), 我們繼續講講component是干什么用的。
   我們得先理解一下容器和組件的關(guān)系。
   需求被傳遞到了容器里面, 在合適的時(shí)候, 會(huì )傳遞給下一個(gè)容器處理。
   而容器里面又盛裝著(zhù)各種各樣的組件, 我們可以理解為提供各種各樣的增值服務(wù)。
   manager: 當一個(gè)容器里面裝了manager組件后,這個(gè)容器就支持session管理了, 事實(shí)上在tomcat里面的session管理, 就是靠的在context里面裝的manager component.
   logger: 當一個(gè)容器里面裝了logger組件后, 這個(gè)容器里所發(fā)生的事情, 就被該組件記錄下來(lái)啦! 我們通常會(huì )在logs/ 這個(gè)目錄下看見(jiàn) catalina_log.time.txt 以及 localhost.time.txt 和localhost_examples_log.time.txt。 這就是因為我們分別為:engin, host以及context(examples)這三個(gè)容器安裝了logger組件, 這也是默認安裝, 又叫做標配 :)
   loader: loader這個(gè)組件通常只會(huì )給我們的context容器使用, loader是用來(lái)啟動(dòng)context以及管理這個(gè)context的classloader用的。
    pipline: pipeline是這樣一個(gè)東西, 當一個(gè)容器決定了要把從上級傳遞過(guò)來(lái)的需求交給子容器的時(shí)候, 他就把這個(gè)需求放進(jìn)容器的管道(pipeline)里面去。 而需求傻呼呼得在管道里面流動(dòng)的時(shí)候, 就會(huì )被管道里面的各個(gè)閥門(mén)攔截下來(lái)。 比如管道里面放了兩個(gè)閥門(mén)。 第一個(gè)閥門(mén)叫做“access_allow_vavle”, 也就是說(shuō)需求流過(guò)來(lái)的時(shí)候,它會(huì )看這個(gè)需求是哪個(gè)IP過(guò)來(lái)的, 如果這個(gè)IP已經(jīng)在黑名單里面了, sure, 殺! 第二個(gè)閥門(mén)叫做“defaul_access_valve”它會(huì )做例行的檢查, 如果通過(guò)的話(huà),OK, 把需求傳遞給當前容器的子容器。 就是通過(guò)這種方式, 需求就在各個(gè)容器里面傳遞,流動(dòng), 最后抵達目的地的了。
    valve: 就是上面所說(shuō)的閥門(mén)啦。
   Tomcat里面大概就是這么些東西, 我們可以簡(jiǎn)單地這么理解tomcat的框架,它是一種自上而下, 容器里又包含子容器的這樣一種結構。
2. Tomcat的啟動(dòng)流程
   這篇文章是講tomcat怎么啟動(dòng)的,既然我們大體上了解了TOMCAT的框架結構了, 那么我們可以望文生意地就猜到tomcat的啟動(dòng), 會(huì )先啟動(dòng)父容器,然后逐個(gè)啟動(dòng)里面的子容器。 啟動(dòng)每一個(gè)容器的時(shí)候, 都會(huì )啟動(dòng)安插在他身上的組件。 當所有的組件啟動(dòng)完畢, 所有的容器啟動(dòng)完畢的時(shí)候, tomcat本身也就啟動(dòng)完畢了。
   順理成章地, 我們同樣可以猜到, tomcat的啟動(dòng)會(huì )分成兩大部分, 第一步是裝配工作。 第二步是啟動(dòng)工作。
   裝配工作就是為父容器裝上子容器, 為各個(gè)容器安插進(jìn)組件的工作。 這個(gè)地方我們會(huì )用到digester模式, 至于digester模式什么, 有什么用, 怎么工作的. 請參考 <http://software.ccidnet.com/pub/article/c322_a31671_p2.html>
   啟動(dòng)工作是在裝配工作之后, 一旦裝配成功了, 我們就只需要點(diǎn)燃最上面的一根導線(xiàn), 整個(gè)tomcat就會(huì )被激活起來(lái)。 這就好比我們要開(kāi)一輛已經(jīng)裝配好了的汽車(chē)的時(shí)候一樣,我們只要把鑰匙插進(jìn)鑰匙孔,一擰,汽車(chē)的引擎就會(huì )發(fā)動(dòng)起來(lái),空調就會(huì )開(kāi)起來(lái), 安全裝置就會(huì )生效, 如此一來(lái),汽車(chē)整個(gè)就發(fā)動(dòng)起來(lái)了。(這個(gè)過(guò)程確實(shí)和TOMCAT的啟動(dòng)過(guò)程不謀而和, 讓我們不得不懷疑 TOMCAT的設計者是在GE做JAVA開(kāi)發(fā)的)。
2.1 一些有意思的名稱(chēng):
   Catalina
   Tomcat
   Bootstrap
   Engin
   Host
   Context
   他們的意思很有意思:
   Catalina: 遠程轟炸機
   Tomcat: 熊貓轟炸機 -- 轟炸機的一種(這讓我想起了讓國人引以為豪的熊貓手機,是不是英文可以叫做tomcat??? , 又讓我想起了另一則廣告: 波導-手機中的戰斗機、波音-客機中的戰斗機 )
   Bootstap: 引導
   Engin: 發(fā)動(dòng)機
   Host: 主機,領(lǐng)土
   Context: 內容, 目標, 上下文
  
   ... 在許多許多年后, 現代人類(lèi)已經(jīng)滅絕。 后現代生物發(fā)現了這些單詞零落零落在一塊。 一個(gè)自以為聰明的家伙把這些東西翻譯出來(lái)了:
   在地勤人員的引導(bootstrap)下, 一架轟炸架(catalina)騰空躍起, 遠看是熊貓轟炸機(tomcat), 近看還是熊貓轟炸機! 憑借著(zhù)優(yōu)秀的發(fā)動(dòng)機技術(shù)(engin), 這架熊貓轟炸機飛臨了敵國的領(lǐng)土上空(host), 對準目標(context)投下了毀天滅地的核彈頭,波~ 現代生物就這么隔屁了~
 
   綜上所述, 這又不得不讓人聯(lián)想到GE是不是也參與了軍事設備的生產(chǎn)呢?
   反對美帝國主義! 反對美霸權主義! 和平萬(wàn)歲! 自由萬(wàn)歲!
  
2.2  歷史就是那么驚人的相似! tomcat的啟動(dòng)就是從org.apache.catalina.startup.Bootstrap這個(gè)類(lèi)悍然啟動(dòng)的!
   在Bootstrap里做了兩件事:
   1. 指定了3種類(lèi)型classloader:
      commonLoader: common/classes、common/lib、common/endorsed
      catalinaLoader: server/classes、server/lib、commonLoader
      sharedLoader:  shared/classes、shared/lib、commonLoader
   2. 引導Catalina的啟動(dòng)。
      用Reflection技術(shù)調用org.apache.catalina.startup.Catalina的process方法, 并傳遞參數過(guò)去。
  
2.3 Catalina.java
   Catalina完成了幾個(gè)重要的任務(wù):
   1. 使用Digester技術(shù)裝配tomcat各個(gè)容器與組件。
      1.1 裝配工作的主要內容是安裝各個(gè)大件。 比如server下有什么樣的servcie。 Host會(huì )容納多少個(gè)context。 Context都會(huì )使用到哪些組件等等。
      1.2 同時(shí)呢, 在裝配工作這一步, 還完成了mbeans的配置工作。 在這里,我簡(jiǎn)單地但不十分精確地描述一下mbean是什么,干什么用的。
          我們自己生成的對象, 自己管理, 天經(jīng)地義! 但是如果我們創(chuàng )建了對象了, 想讓別人來(lái)管, 怎么辦呢? 我想至少得告訴別人我們都有什么, 以及通過(guò)什么方法可以找到  吧! JMX技術(shù)給我們提供了一種手段。 JMX里面主要有3種東西。Mbean, agent, connector.
       Mbean: 用來(lái)映射我們的對象。也許mbean就是我們創(chuàng )建的對象, 也許不是, 但有了它, 就可以引用到我們的對象了。
       Agent:  通過(guò)它, 就可以找到mbean了。
       Connector: 連接Agent的方式。 可以是http的, 也可以是rmi的,還可以直接通過(guò)socket。
      發(fā)生在tomcat 裝配過(guò)程中的事情:  GlobalResourcesLifecycleListener 類(lèi)的初始化會(huì )被觸發(fā):
         protected static Registry registry = MBeanUtils.createRegistry();  會(huì )運行
         MBeanUtils.createRegistry()  會(huì )依據/org/apache/catalina/mbeans/mbeans-descriptors.xml這個(gè)配置文件創(chuàng )建 mbeans. Ok, 外界就有了條途徑訪(fǎng)問(wèn)tomcat中的各個(gè)組件了。(有點(diǎn)像后門(mén)兒)
   2. 為top level 的server 做初始化工作。 實(shí)際上就是做通常會(huì )配置給service的兩條connector.(http, ajp)
   3. 從server這個(gè)容器開(kāi)始啟動(dòng), 點(diǎn)燃整個(gè)tomcat.
   4. 為server做一個(gè)hook程序, 檢測當server shutdown的時(shí)候, 關(guān)閉tomcat的各個(gè)容器用。
   5. 監聽(tīng)8005端口, 如果發(fā)送"SHUTDOWN"(默認培植下字符串)過(guò)來(lái), 關(guān)閉8005serverSocket。
2.4 啟動(dòng)各個(gè)容器
   1. Server
      觸發(fā)Server容器啟動(dòng)前(before_start), 啟動(dòng)中(start), 啟動(dòng)后(after_start)3個(gè)事件, 并運行相應的事件處理器。
      啟動(dòng)Server的子容器:Servcie.
   2. Service
      啟動(dòng)Service的子容器:Engin
      啟動(dòng)Connector
   3. Engin
      到了Engin這個(gè)層次,以及以下級別的容器, Tomcat就使用了比較一致的啟動(dòng)方式了。
      首先,  運行各個(gè)容器自己特有一些任務(wù)
      隨后,  觸發(fā)啟動(dòng)前事件
      立即,  設置標簽,就表示該容器已經(jīng)啟動(dòng)
      接著(zhù),  啟動(dòng)容器中的各個(gè)組件: loader, logger, manager等等
      再接著(zhù),啟動(dòng)mapping組件。(注1)
      緊跟著(zhù),啟動(dòng)子容器。
      接下來(lái),啟動(dòng)該容器的管道(pipline)
      然后,  觸發(fā)啟動(dòng)中事件
      最后,  觸發(fā)啟動(dòng)后事件。
 
      Engin大致會(huì )這么做, Host大致也會(huì )這么做, Context大致還是會(huì )這么做。 那么很顯然地, 我們需要在這里使用到代碼復用的技術(shù)。 tomcat在處理這個(gè)問(wèn)題的時(shí)候, 漂亮地使用了抽象類(lèi)來(lái)處理。 ContainerBase. 最后使得這部分完成復雜功能的代碼顯得干凈利落, 干練爽快, 實(shí)在是令人覺(jué)得嘆為觀(guān)止, 細細品來(lái), 直覺(jué)如享佳珍, 另人齒頰留香, 留戀往返??!
     
      Engin的觸發(fā)啟動(dòng)前事件里, 會(huì )激活綁定在Engin上的唯一一個(gè)Listener:EnginConfig。
      這個(gè)EnginConfig類(lèi)基本上沒(méi)有做什么事情, 就是把EnginConfig的調試級別設置為和Engin相當。 另外就是輸出幾行文本, 表示Engin已經(jīng)配置完畢, 并沒(méi)有做什么實(shí)質(zhì)性的工作。
      注1: mapping組件的用處是, 當一個(gè)需求將要從父容器傳遞到子容器的時(shí)候, 而父容器又有多個(gè)子容器的話(huà), 那么應該選擇哪個(gè)子容器來(lái)處理需求呢? 這個(gè)由mapping 組件來(lái)定奪。
   
   4. Host
       同Engin一樣, 也是調用ContainerBase里面的start()方法, 不過(guò)之前做了些自個(gè)兒的任務(wù),就是往Host這個(gè)容器的通道(pipline)里面, 安裝了一個(gè)叫做
 “org.apache.catalina.valves.ErrorReportValve”的閥門(mén)。
       這個(gè)閥門(mén)的用處是這樣的:  需求在被Engin傳遞給Host后, 會(huì )繼續傳遞給Context做具體的處理。 這里需求其實(shí)就是作為參數傳遞的Request, Response。 所以在context把需求處理完后, 通常會(huì )改動(dòng)response。 而這個(gè)org.apache.catalina.valves.ErrorReportValve的作用就是檢察response是否包含錯誤, 如果有就做相應的處理。
   5. Context
       到了這里, 就終于輪到了tomcat啟動(dòng)中真正的重頭戲,啟動(dòng)Context了。
 StandardContext.start() 這個(gè)啟動(dòng)Context容器的方法被StandardHost調用.
 5.1 webappResources 該context所指向的具體目錄
 5.2 安裝defaultContex, DefaultContext 就是默認Context。 如果我們在一個(gè)Host下面安裝了DefaultContext,而且defaultContext里面又安裝了一個(gè)數據庫連接池資源的話(huà)。 那么其他所有的在該Host下的Context, 都可以直接使用這個(gè)數據庫連接池, 而不用格外做配置了。
  5.3 指定Loader. 通常用默認的org.apache.catalina.loader.WebappLoader這個(gè)類(lèi)。   Loader就是用來(lái)指定這個(gè)context會(huì )用到哪些類(lèi)啊, 哪些jar包啊這些什么的。
 5.4 指定 Manager. 通常使用默認的org.apache.catalina.session. StandardManager 。 Manager是用來(lái)管理session的。
     其實(shí)session的管理也很好實(shí)現。 以一種簡(jiǎn)單的session管理為例。 當需求傳遞過(guò)來(lái)的時(shí)候, 在Request對象里面有一個(gè)sessionId 屬性。 OK, 得到這個(gè)sessionId后, 我們就可以把它作為map的key,而value我們可以放置一個(gè)HashMap. HashMap里邊兒, 再放我們想放的東西。
 5.5 postWorkDirectory (). Tomcat下面有一個(gè)work目錄。 我們把臨時(shí)文件都扔在那兒去。 這個(gè)步驟就是在那里創(chuàng )建一個(gè)目錄。 一般說(shuō)來(lái)會(huì )在%CATALINA_HOME%/work/Standalone\localhost\ 這個(gè)地方生成一個(gè)目錄。
5.6  Binding thread。到了這里, 就應該發(fā)生 class Loader 互換了。 之前是看得見(jiàn)tomcat下面所有的class和lib. 接下來(lái)需要看得見(jiàn)當前context下的class。 所以要設置contextClassLoader, 同時(shí)還要把舊的ClassLoader記錄下來(lái),因為以后還要用的。
5.7  啟動(dòng) Loader. 指定這個(gè)Context具體要使用哪些classes, 用到哪些jar文件。 如果reloadable設置成了true, 就會(huì )啟動(dòng)一個(gè)線(xiàn)程來(lái)監視classes的變化, 如果有變化就重新啟動(dòng)Context。
5.8  啟動(dòng)logger
5.9  觸發(fā)安裝在它身上的一個(gè)監聽(tīng)器。
 lifecycle.fireLifecycleEvent(START_EVENT, null);
 作為監聽(tīng)器之一,ContextConfig會(huì )被啟動(dòng). ContextConfig就是用來(lái)配置web.xml的。 比如這個(gè)Context有多少Servlet, 又有多少Filter, 就是在這里給Context裝上去的。
 5.9.1 defaultConfig. 每個(gè)context都得配置 tomcat/conf/web.xml 這個(gè)文件。
 5.9.2 applicationConfig 配置自己的 WEB-INF/web.xml 文件
5.9.3 validateSecurityRoles 權限驗證。 通常我們在訪(fǎng)問(wèn)/admin 或者/manager的時(shí)候,需要用戶(hù)要么是admin的要么是manager的, 才能訪(fǎng)問(wèn)。 而且我們還可以限制那些資源可以訪(fǎng)問(wèn), 而哪些不能。 都是在這里實(shí)現的。
5.9.4 tldScan: 掃描一下, 需要用到哪些標簽(tag lab)
5.10 啟動(dòng) manager
5.11 postWelcomeFiles() 我們通常會(huì )用到的3個(gè)啟動(dòng)文件的名稱(chēng):
index.html、index.htm、index.jsp 就被默認地綁在了這個(gè)context上
 5.12 listenerStart 配置listener
 5.13 filterStart 配置 filter
 5.14 啟動(dòng)帶有<load-on-startup>1</load-on-startup>的Servlet.
  順序是從小到大: 1,2,3… 最后是0
  默認情況下, 至少會(huì )啟動(dòng)如下3個(gè)的Servlet:
  org.apache.catalina.servlets.DefaultServlet  
      處理靜態(tài)資源的Servlet. 什么圖片啊, html啊, css啊, js啊都找他
  org.apache.catalina.servlets.InvokerServlet
      處理沒(méi)有做Servlet Mapping的那些Servlet.
  org.apache.jasper.servlet.JspServlet
      處理JSP文件的.
       5.15  標識context已經(jīng)啟動(dòng)完畢。
 走了多少個(gè)步驟啊, Context總算是啟動(dòng)完畢嘍。
    OK! 走到了這里, 每個(gè)容器以及組件都啟動(dòng)完畢。 Tomcat終于不辭辛勞地為人民服務(wù)了!
3. 參考文獻:
    <http://jakarta.apache.org/tomcat/>
    <http://www.onjava.com/pub/a/onjava/2003/05/14/java_webserver.html>
   
4. 后記
    這篇文章是講解tomcat啟動(dòng)框架的,還有篇文章是講解TOMCAT里面的消息處理流程的細節的。 文章內容已經(jīng)寫(xiě)好了, 現在正在整理階段。 相信很快就可以做出來(lái), 大家共同研究共同進(jìn)步。
    這篇文章是獨自分析TOMCAT源碼所寫(xiě)的, 所以一定有地方是帶有個(gè)人主觀(guān)色彩, 難免會(huì )有片面之處。若有不當之處敬請批評指教,這樣不僅可以使剛開(kāi)始研究TOMCAT的兄弟們少走彎路, 我也可以學(xué)到東西。
    email: sojan_java@yahoo.com.cn

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Servlet/JSP深入詳解:基于Tomcat的Web開(kāi)發(fā)第一章02
Tomcat 配置文件
Tomcat 詳解
分析Tomcat的工作原理
深入理解java技術(shù)之 Tomcat服務(wù)器詳解
Tomcat啟動(dòng)分析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久