Tomcat
結構:
Tomcat最頂層容器叫Server,代表整個服務器,Server中包含至少一個Service,用於具體提供服務,Service主要包含:Connector和Container,前者處理鏈接並提供Socket與request和response的轉換,Container用於封裝和管理Servlet,以及具體處理request請求。
一個Tomcat里一個Server,包含多個Service,一個Service只有一個Container,可以有多個Connector。一個Container只有一個Engine,Engine里面可以有多個Host,每個Host(虛擬主機,站點)下可以有多個Context(代表一個應用),每個Context下可以有過個Wrapper(每個封裝一個Servlet)。
Tomcat里的server由Catalina來管理,他是Tomcat的管理類,load(調server的init),start(調server的start,下同),stop三個方法管理服務器生命周期。
啟動:
正常情況啟動Tomcat就是調用Bootstrap的main方法,main,新建bootstrap,執行init初始化,並調用start。init里初始化classloader,由此創建Catalina實例,賦給catalinaDaemon變量。
bootstrap的start調用setAwait(true),load(args),start()三個方法,這三個方法又都調用Catalina的相應方法進行具體執行。在Catalina中,setAwait用於設置await屬性的值,服務器啟動之后據此判斷是否進入啟動狀態,其load方法根據cong/server.xml創建了Server對象,並賦值給server屬性,然后調用Server的init方法。其start方法主要調用了server的start方法去啟動服務器。
Server接口中提供addService和removeService,server的init方法和start方法分別循環調用每個Service的init和start方法。 都是類似的一層一層的往下調用的。bootstrap-->Catalina-->Standardserver-->StandService-->Container-->MapperUstener-->Executer-->Connector.
生命周期管理:
Tomacat通過,org.apache.Lifecycle接口統一管理生命周期,所有有生命周期的組件都要實現Lifecycle接口,這個接口做了四件事:
1,定義了13個String類型的常量,用於LifecycleEvent時間的type屬性中,作用是區分組件發出 事件時的狀態(如初始化前、啟動前、啟動后等)。
2,定義了三個管理監聽器的方法addLifecycleListener,findLifecycleListeners,
removeLifecycleListener,添加,查找和刪除。
3,定義了4個生命周期方法:init、start、stop、destroy。
4,定義了獲取當前狀態的兩個方法,getState,getStateName,分別獲取當前的狀態和String類型的狀態的名字。
Container:
Container啟動是被Service調用init和start方法;是Tomcat中容器的接口,一共有四個子接口(子容器),Engine、Host,Context,Wrapper和一個默認的實現類ContainerBase,這四個子容器都有一個對應的StandXXX實現類,都繼承自ContainerBase,Base又間接繼承LifecycleBase。
每個Service一個Container,一個Engine,Engine里面可以有多個Host,每個Host(虛擬主機,站點)下可以有多個Context(代表一個應用),每個Context下可以有過個Wrapper(每個封裝一個Servlet)。
4種容器的配置:
Engine和Host都是在conf/server.xml文件中,context有三種方式,可以通過文件(server.xml,conf/engineName/hostName/應用名.xml,conf/context.xml等),還可以自己將war包放到host目錄下,還可以將應用的文件夾直接放到Host目錄下。
Pipeline-Value管道:
Container處理請求是使用Pipeline-Value管道來處理的:
Pipeline-value是責任鏈處理模式,責任鏈模式是指在一個請求的處理過程中有多個處理者依次對請求進行處理,這個是管道模型,和普通的責任鏈模型又有一點不同:1,每個pipeline都有特定的Value,在管道的最后執行,叫做baseValue,這個baseValue不可刪除。2,在上層管道的baseValue中會調用下層容器的管道。類似多層次的快遞運輸和再分配再運輸。
例如:Engine的管道中依次執行Engine的各個value,最后至此那個satandardEngineValue用來調用Host的管道……,知道最后執行wrapper管道中的StandWrapperValue。跟Filter中用到的FilterChain很相似,而Servlet就相當於最后的BaseValue。
Pipe-line管道的實現分為生命周期的實現和處理請求兩部分:1,Container中的Pipe-line在抽象類ContainerBase中定義,並在生命周期的startInternal,stopInternal,destoryInternal方法中調用管道的相應的生命周期方法,2,Connector在接收到請求后會調用最頂層容器的Pipeline來處理,Pipeline調用所包含的Value的invoke方法來處理請求,並且在BaseValue中有調用了子容器Pipeline所包含value的invoke方法,直到最后調用了Wrapper的Pipeline所包含的BaseValue-StandWrapperValue,在其中創建Filter-Chain並調用期doFilter方法來處理請求,FilterChain包含着我們配置的請求相匹配的Filter和Servlet,其doFilter方法會一次調用所有的Filter的doFilter方法和Servlet的service方法,進而處理請求。
Connector分析:
Connector用於接受請求並將請求封裝成Request和Response來具體處理,最底層使用Socket來進行連接的,Request和Response是按照Http協議來封裝的,所以Connector同時實現了TCP/IP協議和http協議,Request和Response封裝完之后交給container進行處理,Connector就是Servlet的容器,Container處理完之后返回給Connector,最后Connector使用Socket將處理結果返回給客戶端。這樣整個請求就完成了。注意這只是Tomcat的處理完成了,在Container內部封裝的各個Servlet會進行進一步的處理。
Connector中具體是使用ProtocolHandler來處理請求,不同的ProtocolHandler代表不同的連接類型。ProtocolHandler有三個最為重要的組件:Endpoint,Processor,Adapter;Endpoint用於處理底層Socket的網絡連接,Processor用於將Endpoint接收到的Socket封裝成Request,Adapter用於將封裝好的Request交給Container進行具體的處理。也就是說:Endpoint用來實現TCP/IP協議,Processor實現HTTP協議,Adapter將請求適配到Servlet容器進行具體的處理。
Connector類本省的作用主要是在其創建時創建ProtocolHandler,然后在生命周期的相關方法中調用了Protocol的相關生命周期方法。內部的Processor在其process方法中會調用Adapter的service方法來處理請求,Adapter的service方法主要是通過調用Container管道中的invoke方法來處理請求。
//調用Container管道的代碼
connector.getService().getContainer().getPipeline().getFirst().invoke(request,response);
這里首首先從Connector中獲取到Service,然后從中獲取Container,再獲取管道,再獲取管道的第一個value,最后調用invoke方法執行請求。Service中保存的是最頂層的容器,當調用最頂層容器管道的invoke方法時,管道將逐層調用各層容器的管道中的Value的invoke方法,知道最后調用Wrapper的管道中的BaseValue(StandardWrapperValue)來處理Filter和Servlet。
參考:《看透springMVC》
----名白
http://www.cnblogs.com/mingbai/p/TomcatAnalysis.html