<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Tomcat源碼分析 · 壹

          共 2261字,需瀏覽 5分鐘

           ·

          2021-10-01 08:53

          前言

          從今天開始,我們開始分析tomcat的源碼,至于原因嘛,第一Tomcat是非常優(yōu)秀的web服務器,它占據著全球一半以上的市場份額,就連spring boot這樣的頂級框架都在用tomcat做底層實現,這足以說明其流行程度。當然,其流行的另一個重要原因是,它是開源的,它是apache基金會下的一個頂級項目,相比做java開發(fā)的小伙伴應該沒人不知道tomcat吧。

          基于以上原因,我們今天來看下Tomcat的源碼實現。

          昨天在某乎上看到一個大佬分享了Tomcat的源碼視頻,大佬說關于源碼的學習應該從以下幾點入手:

          • 組件及功能
          • 設計模式
          • 線程安全
          • 對比聯(lián)想

          所以本次源碼分析我們就從以上幾點開始入手。我昨天說要加強設計模式就是從這里看來的,畢竟看清楚了設計模式,源碼分析起來就沒那么難了。

          Tomcat

          首先,我們看Tomcat源碼的結構:

          這個結構和我們平時下載到的發(fā)布版本基本上一致。這里源碼剖析和版本無關,但是如果線上環(huán)境使用的話,建議使用最新版,因為9.0.31以下的版本存在漏洞,關于漏洞加固我們昨天已經分享過了,還沒看的小伙伴可以爬個樓看下。

          我們先來看下bin下面的啟動腳本,從startup腳本中我們可以找到項目啟動入口,這里我們以windows環(huán)境下的bat腳本為例:

          可以看到startup腳本調用的是catalina腳本,而且傳遞的參數是start

          首先從下面的腳本中我們可以推測出,這里最終應該會通過執(zhí)行Bootstrapmain方法來啟動Tomcat,而且由于%1處的參數是start,所以最終他會去調用noJpda語句塊:

          noJpda語句塊中,由于我們的參數是start,所以他會調用doStart語句塊:

          ddStart操作中,設置了啟動參數,最后調用execCme操作:

          execCmd語句塊中最終通過java命令行的方式,來運行MAINCLASSmain方法啟動tomcat:

          下面我們就來簡單看下Bootstrapmain方法執(zhí)行過程::

          首先,它以單例模式創(chuàng)建了Bootstrap實例,并執(zhí)行它的初始化操作,最后將創(chuàng)建的對象賦值給daemon對象,如果發(fā)生異常會調用handleThrowable方法進行異常處理。這里創(chuàng)建方式是單例模式,首先daemon是一個靜態(tài)私有變量,同時它被volatile關鍵字修飾,確保它在修改后對所有線程可見,為了進一步保證線程安全,這里還引入了daemonLock變量,并加了synchronized鎖,下面是這兩對象的定義及修飾:

          main方法的下半部分中,它需要執(zhí)行daemonload方法和start方法來啟動容器,這里發(fā)生異常,同樣會調用handleThrowable方法來處理異常。另外從這幾行代碼中,我們可以看出來,command其實只支持通過args參數傳入的,需要注意的是,command必須是args的最后一個參數:

          下面我們就來逐一看下與 Bootstrap相關的幾個方法。

          init

          首先是init方法,這個方法主要有兩部分操作,一部分就是關于類加載器的操作,一部分就是關于Catalina的操作。

          initClassLoaders方法中,主要是創(chuàng)建了三個類加載器:

          這里的commonservershared分別表示不同的配置名,在creaeteClassLoader方法中會根據該名稱從catalina.properties文件中獲取對應的配置

          在獲取配置資源的時候,會從三個地方獲取catalina.properties文件,分別是系統(tǒng)的根目錄、conf目錄、和/org/apache/catalina/startup/包下面,但只會解析其中一個,會按照我們這里說的順序解析,如果中間任意一個文件不為空,則后面的文件就不會被解析到:

          config目錄下的catalina.properties文件中,只有common.loader是有值的,其他兩個都是空的:

          可以看到common.loader共配置了四個路徑,分別包括兩個目錄及其下的jar文件。

          首先會在replace方法中替換其中${catalina.base}這樣配置,然后在getPaths方法中最終匹配·其中配置的內容。

          這里的gatPaths方法就是為了解析出配置文件中的路徑,然后返回:

          最后,調用ClassLoaderFactorycreaeteClassLoader方法創(chuàng)建了一個URLClassLoader的實例,入參就是出jar文件之外的路徑:

          好了,由于時間的關系,我們今天就只說init方法中的一部分,剩下的內容明天繼續(xù),另外今天打算搞下tomcat的環(huán)境,讓tomcat能在idea環(huán)境下debug

          總結

          從目前情況來看,tomcat的源碼和spring boot比起來,還是比較簡單的,當然這也不排除正是經歷了spring boot源碼的磨礪,才讓我們現在看tomcat的源碼如此地輕松。

          另外有個好消息說下,由于最近一直忘記提交內容,所以今天我專門搞了一個定時任務提交內容,這樣以后每天六點定時任務會自動幫我提交內容,我再也不用擔心寫好的內容忘記提交了,so easy

          好了,各位小伙伴晚安吧,我要繼續(xù)搞環(huán)境了!

          - END -


          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  肏屄中国一级黄色 | 欧美激情一区二区A片成人牛牛 | 成人91看片 | 人人操超碰在线观看 | 美女超碰|