How Tomcat works — 二、tomcat啟動(1)


主要介紹tomcat啟動涉及到的一些接口和類。

目錄

  • 概述
  • tomcat包含的組件
  • server和service
  • Lifecycle
  • Container
  • Connector
  • 總結

概述

tomcat作為一個服務器,它的主要功能就是接收請求——處理請求——返回,如果是我們自己實現一個最簡單的服務器,啟動一個線程監聽某個端口,該端口有數據進來的話就接收數據,然后在啟動一個線程去處理接收到的數據並返回。那么啟動一個服務器最重要的就是啟動一個線程監聽某個端口,tomcat也是,只不過tomcat包含很多組件,首先要完成組件的初始化,然后再依次啟動各個組件。所以要知道tomcat 的啟動過程,首先了解下tomcat的組件。

tomcat包含的組件

  • server和service:server用來啟動和關閉服務器,包含服務器組件service,service包含其他組件
  • Lifecycle:管理整個tomcat的生命周期,包括start,stop。tomcat所有的組件都實現了該接口(或者繼承了實現該接口的類)
  • Container:tomcat中最重要的部分,servlet的容器
  • Connector:tomcat的連接器,負責監聽端口,接收請求並分發請求

其實還包括Processor、Session、Manager、Deployer等,但是在啟動過程中,這些不是最重要的,在了解了整個過程之后在進行具體學習。

server和service

tomcat 提供了一種優雅的服務器啟動和停止的方法,由server啟動service組件,service啟動所有包含的組件。service包含Container、Connector等組件。

Lifecycle

生命周期組件里面主要包含一個接口、一個類、一個enum:Lifecycle、LifecycleEvent、LifecycleState。

Lifecycle接口

接口org.apache.catalina.Lifecycle包含以下定義:

  • 管理生命周期的基本方法,如:start,stop
  • 對於組件listener的管理
  • 組件生命周期內可能會觸發的事件,如:START_EVENT,STOP_EVENT等,每一個常量字符串對應一種LifecycleEvent

抽象類LifecycleBase實現了Lifecycle接口,主要提供了基本的start和stop實現,並增加了以下方法

  • 關於事件的:fireLifecycleEvent(protect,可以被子類重載、使用),用來觸發該組件的所有Listener
  • 關於初始化子組件的:initInternal(protect),startInternal(protect)等,因為在tomcat的許多組件都是父子關系(比如:Engine和Host),這也是tomcat生命周期管理優雅的地方:每個組件負責啟動自己的子組件或者相關組件(監聽了該組件的某些事件START_EVENT等),所以tomcat只要啟動最頂層的組件即可

抽象類LifecycleMBeanBase繼承了LifecycleBase類,這個類實現了LifecycleBase的一些方法,提供了一些MBean的基本管理,tomcat提供了對JMX的支持。

LifecycleEvent類

org.apache.catalina.LifecycleEvent 繼承自 java.util.EventObject ,表示lifecycle觸發的事件,和事件緊密關聯的就是listener了,所有想感知組件生命周期狀態變化的類都要事先這個接口 (org.apache.catalina.LifecycleListener) 來監聽對應的事件。事實上比如ContextConfig的初始化就是監聽了Context的事件。

LifecycleEnum

提供了lifecycle的變化的各種狀態,參考下圖(tomcat javadoc

Container

其實tomcat作為servlet容器作重要的部分就是Container組件,Container組件是四層架構,類圖如下:

簡單介紹容器的四層架構:

  • Engine:在catalina容器架構中不是必要的,但是如果要使用一定是處於容器的最頂層,下面有一個或者多個Host(虛擬主機),engine負責將請求分發給對應的虛擬主機
  • Host:表示一個虛擬主機,下面有一個或者多個Context,Host負責將請求分發給對應的Context
  • Context:表示一個webapp,下面有一個或者多個Wrapper,負責將請求映射到對應的Wrapper
  • Wrapper:表示一個servlet,負責加載和初始化servlet

Connector

 

在剛開始我們說過了,自己實現服務器的話就是監聽一個端口,接收請求,這也是tomcat Connector組件的作用,最后監聽端口是由JIoEndpoint的一個內部類Acceptor來完成的,所以當JIoEndpoint$Acceptor線程啟動的時候,整個tomcat服務器也就啟動完成了。

tomcat支持http和ajp協議,所以提供了Http11Protocol和AjpProtocol來處理對應的協議(上面主要畫出了http協議的部分)。

總結

以上是tomcat啟動所涉及到的主要類和接口,當然了其中涉及到的遠不止於此,但是一開始我也說了對於不同的目的,可以有針對性的學習,所以以上只關注了一些戶主要的類。還有一個問題就是,我還是有點糾結的:其實我覺得記錄的時候沒有必要添加大段代碼,因為這些代碼都比較好懂,而且如果真要閱讀的話可以隨時找得到,當然了,對於一些很是重要或者經典的代碼還是很有必要專門分析的。

在閱讀的過程中記了一些筆記和繪制了一些圖(這些在tomcat源碼閱讀的最后再附上),但是感覺都比較瑣碎,經過這么一整理感覺更加明晰了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM