1. 程式人生 > >由淺入深--探究Tomcat9.0---入門篇1

由淺入深--探究Tomcat9.0---入門篇1

好幾個月沒寫部落格了,一是在籌備轉型事宜,二是一直在研究tomcat,現在總算有一些眉目了。現在將自己這幾個月的研究成果給各位看官奉上,希望大家喜歡。

本次原始碼分析預計分為五大專題

第一部分是Tomcat入門篇(元件介紹,啟動流程分析)

第二部分是手寫tomcat實現。

第三部分是Tomcat的設計模式總結

第四部分是原始碼深入探究,

第五部分是Tomcat的優化專題。

  很多人說看不懂原始碼,不懂方式方法。博主也是小白,但是原始碼看的比較多,這次分析以博主的第一人稱視角來分析,語言樸實易懂,不管觀眾老爺是否閱讀過Tomcat原始碼,以一個小白的角度來一步步分析原始碼的過程,想必會很有趣的!一定不要錯過這頓豐盛的大餐哦。下面我就準備上菜啦,翠花,上酸菜!

原始碼分析網上一搜一大把,但是看起來感覺質量高的比較少,含糊其辭,千篇一律的居多。原始碼就是要細看,要精讀才會對自己有實質性的幫助。但是看起來要細心才行。不知道這種風格大家會不會喜歡。以後想做一個原始碼分析的公眾號,就用這種風格。不知道可行否?請大家看過後留下些意見。

題頭:Tomcat 9.0概述:tomcat9.0版本已經取消了bio的實現預設採用nio的實現方式

網路協議實現方式

而且從效能上來看,不要小瞧tomcat,其實無論是Jetty,webLogic這種,還是最近大熱的netty這些伺服器。每個伺服器都有各自適應的場景,在高併發條件下,也不見得tomcat的效能就比netty弱。伺服器的選型這種問題不能一概而論

,和記憶體,cpu,業務場景都有很大關係。netty是基於tcp協議的,tomcat是基於http協議的,如果對網路協議不熟悉的話,不建議用netty,網路協議的解析不是一個簡單的事。

一 :  Tomcat開篇之 Tomcat基本元件介紹

 本系列所有原始碼解析基於Tomcat 9.0.12版本。

Tomcat的元件大體結構如下

                                                                       圖片來源於百度圖片

   整個Tomcat包裝在Server內,具體來說幾大重要的元件分別是

   1.Service: 一個Server可以有多個Service,Service包裹了整個邏輯元件。

   2.Connector:簡單來說Connector就是負責接收客戶端的request,然後在tomcat處理過後再將請求傳送出去的橋樑。

   3.Engine:一個Service裡面只有一個engine。字面理解是引擎,原始碼註釋中給出的解釋是負責處理來自Service中的Connector的所有請求。其實還有一個作用就是將請求傳送出去。

   4.Host:每一個host就是一個主機。可以繫結不同的埠。每一個host裡面有多個context上下文。

  5.Context:每一個context對應一個上下文,裡面有多個web服務,每一個web服務裡面有多個servlet。其中Resource和Global Naming Resources一樣,只不過global是全域性的,所有web專案都可以共用。而Resource對應的是一個web專案。Resources定義了資源之後需要一個Resources link來指向對應的Resource

   其實簡單來說,上面可以分為兩部分,connector和container,container包含了engine,host,context。每個元件都有一個Standart開頭的標準實現類。上面這些元件的初始化過程完美詮釋了什麼叫模版設計模式。

   下面是其他部分的元件解釋

   5.Listener: 負責監聽前面說的四大元件。上面說的四個元件對應的Config類分別實現了LifecycleListener介面。來實現監聽功能。這種設計模式體現了設計模式中的觀察者設計模式。(後續文章會單獨介紹tomcat的設計模式)

 6. Global Naming Resources: 這個是和JNDI配和使用。

   那麼首先需要了解JNDI,JNDI(Java Naming and Directory Interface,Java命名和目錄介面)是一組在Java應用中訪問命名和目錄服務的API。命名服務將名稱和物件聯絡起來,使得我們可以用名稱訪問物件。目錄服務是一種命名服務,在這種服務裡,物件不但有名稱,還有屬性。 ----轉自百度百科

 說白了啊,其實就是提供了一個map,key是名稱,value就是物件。我們可以在應用中直接通過name來拿物件,而Global Naming Resources的作用,就是可以在xml檔案中配置一個全域性的資源,比如我們經常配置的資料來源。可以配置在xml中。我們預設的server.xml檔案裡面就有一個配置。

我們可以直接從java程式碼裡的MemoryUserDatabaseFactory這個介面拿對應的例項。這個例子最終指向tomcat-users.xml檔案,負責管理使用者授權。舉個例子,如果碰到需要將資料庫的資料來源這些配置在tomcat裡面的時候,就可以用這種配置方式。

  7. 那些個小箭頭,裡面寫著value的那個大家也注意看一下,這個也很重要,在Tomcat進行邏輯處理的時候,在每一個元件裡面是通過Pipeline(管道)來進行處理的。這裡大家可能不理解,大家應該都寫過filter吧,每一個filter寫完之後有一個doFilter(request,response)的方法,意思就是交給下一個過濾器。這裡意思是一樣的,就是這個小元件處理完了交給下一個小元件,全部處理完了才交給下一級。這裡體現出的是設計模式中的責任鏈模式。

  8.Realm:realm元件顧名思義,其實就是授權,每個Standard標準實現類裡面都有一個getRealm方法。

  9.Servlet:我覺得這個位置寫成wrapper更合適,這個地方就是每個servlet最後都包裝成wrapper,然後在StandardContext的loadOnStartUp方法初始化的。引數是Wrapper類

10.Cluster將訊息通知給叢集中的其他專案。

11.manager這個元件的設計是為了方便遠端管理tomcat,比如重啟,升級等。不用進入到伺服器就可以直接操作,前提是必須先給使用者授權。下面是tomcat的manager的頁面。

   12 Loader是tomcat的自定義類載入器,這個是一個重點,在部署到tomcat的每個專案裡面。每個專案之間jar包必須要隔離,但是tomcat自己的jar包又要被所有的專案共享,這時候tomcat必須要自定義類載入器也就是classLoader來實現自己的功能。所以要看懂Tomcat原始碼, 首先要理解他的類載入器。

    下一篇會介紹類載入器的基本使用以及Tomcat的類載入器介紹。