Tomcat的結構

Tomcat其實就是一個容器,最頂層的容器叫Server,表明整個服務器,Server中包含至少一個Service,用於具體提供服務。Service主要包含兩部分:Connector和Container。一個Service只有一個Container,但能夠有多個Connectors(由於一個服務能夠有多個鏈接,如同時有提供http和https鏈接,也能夠提供相同協議不一樣端口的鏈接)。Catalina是整個Tomcat的管理類,它裏面有三個方法load、start、stop分別用來管理整個服務器的生命週期,load方法用於根據conf/server.xml文件建立Server並調用Server的init方法進行初始化,start方法用於啓動服務器,stop方法用於中止服務器,start和stop方法在內部分別調用了Server的start和stop方法,load方法內部調用了Server的init方法,這三個方法都會按容器的結構逐層調用相應的方法,好比,Server的start方法中會調用全部Service中的start方法,Service中的start方法又會調用全部包含的Connectors和Container的start方法,這樣整個服務器就啓動了,init和stop方法也是同樣的,這就是Tomcat生命週期的管理方式。Catalina還有一個很重要的方法await,直接調用Server的await方法,這個方法的做用是進入一個循環,讓主線程不會退出。Tomcat的main方法並不在Catalina類裏,而是在Bootstrap中,這樣作的好處是能夠把啓動的入口和具體的管理類分開,從而能夠很方便地建立出多種啓動方式。web

 

Lifecycle接口用來管理生命週期,全部的生命週期組件都要實現該接口。一個作了4件事情:服務器

  1. 定義了LifecycleEvent事件的type屬性
  2. 定義了三個管理監聽器的方法addLifecycleListener、findLifecycleListeners和removeLifecycleListener
  3. 定義了4個生命週期的方法:init、start、stop和destroy,用於執行生命週期的各個階段的操做
  4. 定義了獲取當前狀態的兩個方法:getState和getStateName

 

 

Container用於封裝和管理Servlet,以及具體 處理request請求。網絡

Container是Tomcat中容器的接口,一般使用的Servlet就封裝在其子接口Wrapper中。Container一共有4個子接口Engine、Host、Context、Wrapper和一個默認實現 的ContainerBase,每個子接口都是一個容器,這4個子容器都有一個對應的StandardXXX實現類,而且這些實現類都繼承ContainerBase類。另外Container還繼承Lifecycle接口,並且ContainerBase間接繼承LifecycleBase,因此Engine、Host、Context、Wrapper都符合Tomcat的生命週期管理模式。app

Container的子容器Engine、Host、Context、Wrapper是逐層包含的關係,其中Engine是最頂層,每一個Service最多隻能有一個Engine,Engine裏面能夠有多個Host,每一個Host下能夠有多個Context,每一個Context下能夠有多個Wrapper。異步

  • Engine:引擎,用來管理多個站點,一個Service最多隻能有一個Engine。
  • Host:表明一個站點,也能夠叫虛擬主機,經過配置Host就能夠添加站點。
  • Context:表明一個應用程序,對應着平時開發的一套程序,或者一個WEB-INF目錄以及下面的web.xml文件。
  • Wrapper:每一個Wrapper封裝着一個Servlet。

 

 

Pipeline-Value管道線程

Container處理請求是使用Pipeline-Value管道來處理的,採用的是責任鏈模式實現的,但有稍微的不一樣:server

  1. 每一個Pipeline都有特定的Value,並且是在管道的最後一個執行,這個Value叫BaseValue,BaseValue是不能夠刪除的
  2. 在上層容器的管道的BaseValue中會調用下層容器的管道。

 

 

Connector用於處理鏈接相關的事情,並提供Socket與request、response的轉換。xml

Connector是用ProtocolHandler來處理請求的,不一樣的ProtocolHandler表明不一樣的鏈接類型,ProtocolHandler裏面有3個很是重要的組件:Endpoint、Processor和Adapter。Endpoint用於處理底層Socket的網絡鏈接,Processor用於將Endpoint接收到的Socket封裝成Request,Adapter用於將封裝好的Request交給Container進行具體處理。也就是說Endpoint用來實現TCP/IP協議,Processor用來實現HTTP協議,Adapter將請求適配到Servelet容器進行具體處理。繼承

  • Endpoint的抽象實現AbstractEndpoint裏面定義的Acceptor和AsyncTimeout兩個內部類和一個Handler接口。Acceptor用於監聽請求,AsyncTimeout用於檢查異步request的超時,Handler用於處理接收到的Socket,在內部調用了Processor進行處理
  • Processor的porcess方法中會調用Adapter的service方法來處理請求。
  • Adapter的service方法主要是調用Container管道中的invoke方法來處理請求。
相關文章
相關標籤/搜索