How Tomcat works — 2、tomcat啓動(1)

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

目錄

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

概述

tomcat做爲一個服務器,它的主要功能就是接收請求——處理請求——返回,若是是咱們本身實現一個最簡單的服務器,啓動一個線程監聽某個端口,該端口有數據進來的話就接收數據,而後在啓動一個線程去處理接收到的數據並返回。那麼啓動一個服務器最重要的就是啓動一個線程監聽某個端口,tomcat也是,只不過tomcat包含不少組件,首先要完成組件的初始化,而後再依次啓動各個組件。因此要知道tomcat 的啓動過程,首先了解下tomcat的組件。java

tomcat包含的組件

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

其實還包括Processor、Session、Manager、Deployer等,可是在啓動過程當中,這些不是最重要的,在瞭解了整個過程以後在進行具體學習。web

server和service

tomcat 提供了一種優雅的服務器啓動和中止的方法,由server啓動service組件,service啓動全部包含的組件。service包含Container、Connector等組件。apache

Lifecycle

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

Lifecycle接口

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

  • 管理生命週期的基本方法,如: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的事件。app

LifecycleEnum

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

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源碼閱讀的最後再附上),可是感受都比較瑣碎,通過這麼一整理感受更加明晰了。

相關文章
相關標籤/搜索