做網(wǎng)站定金是多少錢百度開車關(guān)鍵詞
優(yōu)質(zhì)博文:IT_BLOG_CN
一、Tomcat 頂層架構(gòu)
Tomcat
中最頂層的容器是Server
,代表著整個服務(wù)器,從上圖中可以看出,一個Server
可以包含至少一個Service
,用于具體提供服務(wù)。Service
主要包含兩個部分:Connector
和Container
。從上圖中可以看出Tomcat
的心臟就是這兩個組件,他們的作用如下:
【1】Connector
用于處理連接相關(guān)的事情,并提供Socket
與Request
和 Response
相關(guān)的轉(zhuǎn)化;
【2】Container
用于封裝和管理Servlet
,以及具體處理Request
請求;
一個Tomcat
中只有一個Server
,一個Server
可以包含多個Service
,一個 Service
只有一個Container
,但是可以有多個Connectors
,這是因為一個服務(wù)可以有多個連接,如同時提供Http
和Https
鏈接,也可以提供向相同協(xié)議不同端口的連接,示意圖如下(Engine
、Host
、Context
下邊會說到):
多個Connector
和一個Container
就形成了一個Service
,有了Service
就可以對外提供服務(wù)了,但是Service
還要一個生存的環(huán)境,必須要有人能夠給她生命、掌握其生死大權(quán),那就非Server
莫屬了!所以整個Tomcat
的生命周期由 Server
控制。另外,上述的包含關(guān)系或者說是父子關(guān)系,都可以在tomcat
的 conf
目錄下的 server.xml
配置文件中看出。
二、簡要解釋下 server.xml 配置文件的信息
server.xml
是Tomcat
中最重要的配置文件,server.xml
的每個元素都對應(yīng)了 Tomcat
中的一個組件;通過對xml
文件中元素的配置,可以實現(xiàn)對Tomcat
中各個組件的控制。
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener"/><Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/><Listener className="org.apache.catalina.core.JasperListener"/><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/><GlobalNamingResources><Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/></GlobalNamingResources><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeOut="20000" redirectPort="8443"/><Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/><Engine defaultHost="localhost" name="Catalina"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/></Realm><Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/><Context docBase="cas-server-webapp" path="/cas" reloadable="true" source="org.eclipse.jst.j2ee.server:cas-server-webapp"/><Context docBase="portal" path="/portal" reloadable="true" source="org.eclipse.jst.jee.server:portal"/></Host></Engine></Service>
</Server>
server.xml
的整體架構(gòu)(簡潔版):
<Server><Service><Connector /><Connector /><Engine><Host><Context /><!-- 現(xiàn)在常常使用自動部署,不推薦配置Context元素,Context小節(jié)有詳細說明 --></Host></Engine></Service>
</Server>
【1】頂層元素:元素是整個配置文件的根元素,元素代表一個Engine
元素以及一組與之相連的Connector
元素。
【2】連接器: 代表了外部客戶端發(fā)送請求到特定Service
的接口;同時也是外部客戶端從特定Service
接收響應(yīng)的接口。
【3】容器:容器的功能是處理Connector
接收進來的請求,并產(chǎn)生對應(yīng)的響應(yīng)。Engine
包含Host
,Host
包含Context
。一個 Engine
組件可以處理Service
中的所有請求,一個Host
組件可以處理發(fā)向一個特定虛擬主機的所有請求,一個Context
組件可以處理一個特定Web
應(yīng)用的所有請求。
三、Tomcat 都有哪些核心組件
【1】Server
:Server
元素在最頂層,代表整個 Tomcat
容器,因此他必須是server.xml
中唯一一個最外層的元素。一個Server
元素可以有一個或多個Service
元素。
<Server port="8005" shutdown="SHUTDOWN">
</Server>
可以看到,最外層有一個 元素,shutdown
屬性表示關(guān)閉Server
的指令;port
屬性表示Server
接收shutdown
指令的端口號,設(shè)置為-1
可以禁掉該端口。Server 的主要任務(wù),就是提供一個接口讓客戶端能夠訪問到這個 Service集合,同時維護它所包含的所有的 Service的生命周期,包含如何初始化,如何結(jié)束服務(wù),如何找到客戶端要訪問的 Service。
【2】Service
:在Connector
和Engine
外面包一層,把它們組合在一起,對外提供服務(wù)。一個Service
可以包含多個Connector
,但是只能包含一個Engine
;其中Connector
的作用是從客戶端接收請求,Engine
的作用是處理接收進來的請求。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"></Service>
</Server>
如上圖,Server
中包含一個名稱為Catalina
的Service
。實際上,Tomcat
可以提供多個Service
,不同的Service
監(jiān)聽不同的端口。
【3】Connector
:接收連接請求,創(chuàng)建Request
和 Response
對象用于和請求端交換數(shù)據(jù);然后分配線程讓Engine
來處理這個請求,并把產(chǎn)生的Request
和Response
對象傳給Engine
。通過配置 Connector
,可以控制請求 Service的協(xié)議及端口號。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /></Service>
</Server>
通過配置第一個Connector
,客戶端可以通過8080
端口號協(xié)議訪問Tomcat
。其中,protocol
屬性規(guī)定了請求的協(xié)議,port
規(guī)定了請求的端口號,redirectPort
表示當(dāng)強制要求https
而請求是 http時,重定向至端口號為8443
的Connector
,connectionTimeout
表示連接的超時時間。
在這個例子中,Tomcat
監(jiān)聽Http
請求,使用的是8080
端口,而不是正式的 80
端口;實際上,在正式的生產(chǎn)環(huán)境中,Tomcat
也常常監(jiān)聽8080
端口。而不是80
端口。這是因為在生產(chǎn)環(huán)境中,很少講Tomcat
直接對外開放接收請求,而是在Tomcat
和客戶端之間加一層代理服務(wù)器(如Nginx
),用于請求的轉(zhuǎn)發(fā)、負載均衡、處理靜態(tài)文件等;通過代理服務(wù)器訪問Tomcat
時,是在局域網(wǎng)中,因為一般仍使用8080
端口。
第二個配置Connector
,客戶端可以通過8009
端口使用AJP
協(xié)議訪問 Tomcat
。AJP
協(xié)議負責(zé)和其他的Http
服務(wù)器(如Apache
)建立連接;在把 Tomcat
與其他服務(wù)器集成時,就需要用到這個連接器,之所以使用 Tomcat
和其他服務(wù)器集成,是因為Tomcat
可以用作Servlet/JSP
容器,但是對靜態(tài)資源處理速度較慢,不如Apache
和IIS
等HTTP
服務(wù)器;因此常常將 Tomcat
和Apache
等集成,前者做Servlet
容器,后者處理靜態(tài)資源,而AJP
協(xié)議便負責(zé)Tomcat
與Apache
的連接。Tomcat
和Apache
等集成的原理如下圖:
【4】Engine
:Engine 組件在Service
組件有且只有一個;Engine
是Service
組件中的請求處理組件。Engine
組件從一個或多個Connector
中接收并處理,并將完成的響應(yīng)返回給Connector
,最終傳遞給客戶端。前面說到,Engine
、Host
和Context
都是容器,但是它們不是平行關(guān)系,而是父子關(guān)系:Engine
包含Host
,Host
包含Context
。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"></Engine></Service>
</Server>
其中name
屬性用于日志和錯誤信息,在整個Server
中應(yīng)該是唯一的。defalutHost
屬性指定了默認的host
名稱,當(dāng)發(fā)往本機的請求指定的host
名稱不存在時,一律使用defaultHost
指定的host
進行處理;因此defaulthost
的值,必須與Engine
中的一個Host
組件的name
屬性值匹配。
【5】Engine
和Host
:Host
是Engine
的子容器。Engine
組件中可以內(nèi)嵌1
個或者多個Host
組件,每個Host
組件代表Engine
中的一個虛擬主機。Host
組件至少有一個,且其中一個的name
必須與 Engine
組件中的defaultHost
屬性相匹配。
【6】Host
的作用:Host
虛擬主機的作用,是運行多個Web
應(yīng)用(一個Context
代表一個Web
應(yīng)用),并負責(zé)安裝、展開、啟動、結(jié)束每個Web
應(yīng)用。Host
組件代表的虛擬主機,對應(yīng)服務(wù)器中一個網(wǎng)絡(luò)名實體(如www.test.com](https://links.jianshu.com/go?to=http%3A%2F%2Fwww.test.com)"或IP地址"116.25.25.25
);為了使用戶可以通過網(wǎng)絡(luò)名連接Tomcat
服務(wù)器,這個名字應(yīng)該在DNS
服務(wù)器上注冊。
客戶端通常使用主機名來標識它們希望連接的服務(wù)器,該主機名也會包含在 HTTP
請求頭中,Tomcat
從HTTP
頭中提取出主機名,尋找名字匹配的主機。如果沒有匹配,請求會發(fā)送至默認的主機。因此默認主機不需要再DNS
服務(wù)器中注冊網(wǎng)絡(luò)名,因為任何與所有Host
名稱不匹配的請求,都會路由至默認主機。
【7】Host
的配置:name
屬性指定虛擬主機的主機名,一個Engine
有且只有一個Host
組件的name
屬性和Engine
組件的 defaultHost
屬性相匹配;一般情況下,主機名需要是在DNS
服務(wù)器中注冊網(wǎng)絡(luò)名,但是Engine
指定的defaultHost
不需要。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host></Engine></Service>
</Server>
unpackWARs
指定了是否將代表Web
應(yīng)用的WAR
文件解壓;如果是true
,通過解壓后的文件結(jié)構(gòu)運行該Web
應(yīng)用,如果是false
,直接使用WAR
文件運行Web
應(yīng)用。
【8】Context
:Context
元素代表在虛擬主機上運行的一個Web
應(yīng)用。在后文中,提到Context
、應(yīng)用或Web
應(yīng)用,他們都代指Web
應(yīng)用,每個Web
應(yīng)用基于WAR
文件,或WAR
文件解壓后對應(yīng)的目錄(這里稱為應(yīng)用目錄)Context
是Host
的子容器,每個Host
都可以定義任意多的Context
元素。元素的配置:Context
元素最重要的屬性是 docBase
和path
,此外reloadable
屬性也比較常用。
docBase
指定了該Web
應(yīng)用使用war
包路徑,或應(yīng)用目錄。需要注意的是:在自動部署場景下(配置文件位于xmlBase
中),docBase
不在appBase
目錄中,才需要指定;如果docBase
指定的war
包或應(yīng)用目錄就在appBase
中,則不需要指定。因為Tomcat
會自動掃描appBase
中的war
包和應(yīng)用目錄,制定了反而造成問題。
path
指定了訪問該Web
應(yīng)用上下文路徑,當(dāng)請求到來時,Tomcat
根據(jù)Web
應(yīng)用的path
屬性與 URL匹配程度來選擇Web
應(yīng)用處理相應(yīng)請求。例如:Web
應(yīng)用app1
的path
屬性是/app1
,Web
應(yīng)用app2
的path
屬性是"/app2",那么請求/app1/index.html
會交由app1
來處理;而請求/app2/index.html
會交由 app2
來處理。如果一個Context
元素的path
屬性為"",那么這個Context
是虛擬主機的默認的Web
應(yīng)用;當(dāng)請求的uri
與所有的path
都不匹配時,使用該默認Web
應(yīng)用來處理。
但是,需要注意的是,在自動部署場景(配置文件位于xmlBase
中),不能指定path屬性,path
屬性由配置的文件的文件名,WAR
文件的文件名或應(yīng)用目錄的名稱自動推導(dǎo)出來。如掃描Web
應(yīng)該時,發(fā)現(xiàn)xmlBase
目錄下的app1.xml
,或appBase
目錄下的app1.WAR
或app1
應(yīng)用目錄,則該Web用于的path
屬性是app1
。如果名稱不是app1
而是ROOT
,則該Web應(yīng)用時虛擬主機默認的Web
應(yīng)用,此時path
屬性推導(dǎo)為""。
reloadable
屬性指示tomcat
是否在運行時監(jiān)控在WEB-INF/classes
和WEB-INF/lib
目錄下class
文件的改動。如果值為true
,那么當(dāng)class
文件改動時,會重新web
應(yīng)用的重新加載。在開發(fā)環(huán)境下,reloadable
設(shè)置為ture
便于調(diào)試;但是在生產(chǎn)環(huán)境中設(shè)置為true
會給服務(wù)器帶來性能壓力,因此reloadable
參數(shù)的默認值為false
。在該例子中,docBase
位于Host
的appBase
目錄之外;path
屬性沒有指定,而是根據(jù)app1.xml
自動推導(dǎo)為app1
。
<Context docBase="D:\Program Files\app1.war" reloadable="true"></Context>
若是自動部署(即autoDeploy="true"
),那么server.xml
配置文件中沒有Context
元素的配置。這是因為Tomcat
開啟了自動部署,Web
應(yīng)用沒有在 server.xml
中配置靜態(tài)部署,而是由Tomcat
通過特定的規(guī)則自動部署。
四、Web 的自動部署
要開啟Web
應(yīng)用的自動部署,需要配置所在的虛擬主機;配置的方式就是在配置Host
元素的 deployOnStartup
和autoDeploy
屬性。如果deployOnStartup
和autoDeploy
設(shè)置為true
,則tomcat
啟動自動部署:當(dāng)檢測到新的Web
應(yīng)用或Web
應(yīng)用更新時,會觸發(fā)應(yīng)用的部署(或重新部署)。
二者的主要區(qū)別在于
【1】deployeOnStartup
為true
時,Tomcat
在啟動時檢查Web
應(yīng)用,且檢測到所有的Web
應(yīng)用都試做新應(yīng)用;
【2】autoDeploy
為true
時,Tomcat
在運行時定期檢查新的Web
應(yīng)用或Web
應(yīng)用的更新;
通過配置
deployOnStartup
和autoDeploy
可以開啟虛擬主機自動部署Web
應(yīng)用;實際上,自動部署依賴于檢查是否有新的或更改過的Web
應(yīng)用,而Host
元素中的appBase
和xml
配置設(shè)置了檢查Web
應(yīng)用更新的目錄。
其中,appBase
屬性指定Web
應(yīng)用所在的目錄,默認值是webapps
,這是一個相對路徑,代表 Tomcat
根目錄下的webapps
文件夾。xmlBase
屬性指定Web
應(yīng)用的XML
配置文件所在的目錄,默認值為conf/<engine_name><engine_name>
,例如上面例子中,主機localhost
的xmlBase
的默認值是$TOMCAT_HOME/conf/Catalina/localhost
。
五、appBase 和 docBase的區(qū)別
【1】appBase
:這個目錄下面的子目錄將自動被部署為應(yīng)用,且war
文件將被自動解壓縮并部署為應(yīng)用,默認為tomcat
下webapps
目錄。
【2】docBase
:指定需要關(guān)聯(lián)的項目自動解壓并部署到appBase
目錄下。項目的名稱由path
屬性決定。
先部署 需要注意,docBase
所在的文件或者war
包必須存在。否則項目啟動找不到對應(yīng)的目錄。此時文件解壓到appBase
目錄下,根據(jù)path
屬性,決定解壓后的文件名。
若采用了<Host name="localhost" appBase="webapp" autoDeploy="true">
配置,那么appBase
目錄下的應(yīng)用目錄將會再次部署。此時項目是部署了兩遍。解決辦法,設(shè)置autoDeploy="false"
。
六、Tomcat 頂層架構(gòu)小結(jié)
【1】Tomcat
中只有一個Server
,一個Server
可以有多個Service
,一個Service
可以有多個 Connector
和一個Container
;
【2】Server
掌管著整個Tomcat
的生死大權(quán);
【3】Service
是對外提供服務(wù)的;
【4】Connector
用于接受請求并將請求封裝成Request
和Response
來具體處理;
【5】Container
用于封裝和管理Servlet
,以及具體處理Request
請求;
知道了整個Tomcat
頂層的分層架構(gòu)和各個組件之間的關(guān)系以及作用,對于絕大多數(shù)的開發(fā)人員來說 Server
和Service
對我們來說確實很遠,而我們開發(fā)中絕大部分進行配置的內(nèi)容是屬于Connector
和 Container
的,所以接下來介紹一下Connector
和Container
。
七、Connector 和 Container的微妙關(guān)系
由上述內(nèi)容我們大致可以知道一個請求發(fā)送到Tomcat
之后,首先經(jīng)過Service
然后會交給我們的 Connector
,Connector
用于接收請求并將接收的請求封裝為Request
和Response
來具體處理,Request
和Response
封裝完之后再交由Container
進行處理,Container
處理完請求之后再返回給 Connector
,最后在由Connector
通過Socket
將處理的結(jié)果返回給客戶端,這樣整個請求的就處理完了!
Connector
最底層使用的是Socket
來進行連接的,Request
和Response
是按照HTTP
協(xié)議來封裝的,所以Connector
同時需要實現(xiàn)TCP/IP
協(xié)議和HTTP
協(xié)議。Tomcat
既然處理請求,那么肯定需要先接收到這個請求,接收請求這個東西我們首先就需要看一下Connector
。
八、Container 架構(gòu)分析
Container
用于封裝和管理Servlet
,以及具體處理Request
請求,在Connector
內(nèi)部包含了4
個子容器,結(jié)構(gòu)圖如下:
4個子容器的作用分別是:
【1】Engine
:引擎,用來管理多個站點,一個Service
最多只能有一個Engine
;
【2】Host
:代表一個站點,也可以叫虛擬主機,通過配置Host
就可以添加站點;
【3】Context
:代表一個應(yīng)用程序,對應(yīng)著平時開發(fā)的一套程序,或者一個WEB-INF
目錄以及下面的web.xml
文件;
【4】Wrapper
:每一Wrapper
封裝著一個Servlet
;
下面找一個Tomcat
的文件目錄對照一下,如下圖所示:
Context
和Host
的區(qū)別是Context
表示一個應(yīng)用,我們的Tomcat
中默認的配置下webapps
下的每一個文件夾目錄都是一個Context
,其中ROOT
目錄中存放著主應(yīng)用,其他目錄存放著子應(yīng)用,而整個 webapps就是一個 Host站點。我們訪問應(yīng)用Context
的時候,如果是ROOT
下的則直接使用域名就可以訪問,例如:www.ledouit.com,如果是Host(webapps)
下的其他應(yīng)用,則可以使用 www.ledouit.com/docs 進行訪問,當(dāng)然默認指定的根應(yīng)用ROOT
是可以進行設(shè)定的,只不過Host
站點下默認的主營用是ROOT
目錄下的。
看到這里我們知道Container
是什么,但是還是不知道Container
是如何進行處理的以及處理完之后是如何將處理完的結(jié)果返回給Connector
的。
十、Container 如何處理請求的
Container
處理請求是使用Pipeline-Valve
管道來處理的!(Valve
是閥門之意)Pipeline-Valve
是責(zé)任鏈模式,責(zé)任鏈模式是指在一個請求處理的過程中有很多處理者依次對請求進行處理,每個處理者負責(zé)做自己相應(yīng)的處理,處理完之后將處理后的請求返回,再讓下一個處理著繼續(xù)處理。
但是!Pipeline-Valve
使用的責(zé)任鏈模式和普通的責(zé)任鏈模式有些不同!區(qū)別主要有以下兩點:
【1】每個Pipeline
都有特定的Valve
,而且是在管道的最后一個執(zhí)行,這個Valve
叫做BaseValve
,BaseValve
是不可刪除的;
【2】在上層容器的管道的BaseValve
中會調(diào)用下層容器的管道。
我們知道Container
包含四個子容器,而這四個子容器對應(yīng)的BaseValve
分別在:StandardEngineValve
、StandardHostValve
、StandardContextValve
、StandardWrapperValve
。Pipeline
的處理流程圖如下:
【1】Connector
在接收到請求后會首先調(diào)用最頂層容器的Pipeline
來處理,這里的最頂層容器的 Pipeline
就是EnginePipeline
(Engine
的管道);
【2】在Engine
的管道中依次會執(zhí)行EngineValve1
、EngineValve2
等等,最后會執(zhí)行 StandardEngineValve
,在StandardEngineValve
中會調(diào)用Host
管道,然后再依次執(zhí)行Host
的 HostValve1
、HostValve2
等,最后在執(zhí)行StandardHostValve
,然后再依次調(diào)用Context
的管道和 Wrapper
的管道,最后執(zhí)行到StandardWrapperValve
。
【3】當(dāng)執(zhí)行到StandardWrapperValve
的時候,會在StandardWrapperValve
中創(chuàng)建FilterChain
,并調(diào)用其 doFilter
方法來處理請求,這個FilterChain
包含著我們配置的與請求相匹配的Filter
和Servlet
,其 doFilter
方法會依次調(diào)用所有的Filter
的doFilter
方法和Servlet
的service
方法,這樣請求就得到了處理!
【4】當(dāng)所有的Pipeline-Valve
都執(zhí)行完之后,并且處理完了具體的請求,這個時候就可以將返回的結(jié)果交給Connector
了,Connector
在通過Socket
的方式將結(jié)果返回給客戶端。
十一、tomcat 容器是如何創(chuàng)建 servlet類實例?用到了什么原理?
當(dāng)容器啟動時,會讀取在webapps
目錄下所有的web
應(yīng)用中的web.xml
文件,然后對xml
文件進行解析,并讀取servlet
注冊信息。然后,將每個應(yīng)用中注冊的servlet
類都進行加載,并通過反射的方式實例化。(有時候也是在第一次請求時實例化)在servlet
注冊時加上如果為正數(shù),則在一開始就實例化,如果不寫或為負數(shù),則第一次請求實例化。
十二、共享 session處理
目前的處理方式有如下幾種:
【1】使用Tomcat
本身的Session
復(fù)制功能。參考http://ajita.iteye.com/blog/1715312
(Session
復(fù)制的配置)方案的有點是配置簡單,缺點是當(dāng)集群數(shù)量較多時,Session
復(fù)制的時間會比較長,影響響應(yīng)的效率;
【2】使用第三方來存放共享Session
:目前用的較多的是使用memcached
來管理共享Session
,借助于memcached-sesson-manager
來進行Tomcat
的Session
管理。參考http://ajita.iteye.com/blog/1716320
(使用MSM
管理Tomcat
集群session
)
【3】使用黏性session
的策略:對于會話要求不太強(不涉及到計費,失敗了允許重新請求下等)的場合,同一個用戶的session
可以由nginx
或者apache
交給同一個Tomcat
來處理,這就是所謂的 session sticky
策略,目前應(yīng)用也比較多。參考:http://ajita.iteye.com/blog/1848665(tomcat session sticky)Nginx
默認不包含session sticky
模塊,需要重新編譯才行(windows
下我也不知道怎么重新編譯)優(yōu)點是處理效率高多了,缺點是強會話要求的場合不合適。
十三、關(guān)于 Tomcat 的 session數(shù)目
這個可以直接從Tomcat
的web
管理界面去查看即可,或者借助于第三方工具Lambda Probe
來查看,它相對于Tomcat
自帶的管理稍微多了點功能,但也不多 ;
十四、Tomcat 一個請求的完整過程
首先DNS
解析機器,一般是ng
服務(wù)器ip
地址,然后ng
根據(jù)server
的配置,尋找路徑為yy/
的機器列表,ip
和端口。最后 選擇其中一臺機器進行訪問。下面為詳細過程:
【1】請求被發(fā)送到本機端口8080
,被在那里偵聽的Coyote HTTP/1.1 Connector
獲得;
【2】Connector
把該請求交給它所在的Service
的Engine
來處理,并等待來自Engine
的回應(yīng);
【3】Engine
獲得請求localhost/yy/index.jsp
,匹配它所擁有的所有虛擬主機Host
;
【4】Engine
匹配到名為 localhost 的 Host(即使匹配不到也把請求交給該 Host處理,因為該Host被定義為該 Engine的默認主機);
【5】localhost Host
獲得請求/yy/index.jsp
,匹配它所擁有的所有Context
;
【6】Host
匹配到路徑為/yy
的Context
(如果匹配不到就把該請求交給路徑名為”“的Context
去處理);
【7】path=”/yy”
的Context
獲得請求/index.jsp
,在它的mapping table
中尋找對應(yīng)的servlet
;
【8】Context
匹配到URL PATTERN
為*.jsp
的servlet
,對應(yīng)于JspServlet
類;
【9】構(gòu)造HttpServletRequest
對象和HttpServletResponse
對象,作為參數(shù)調(diào)用JspServlet
的doGet
或 doPost
方法;
【10】Context
把執(zhí)行完了之后的HttpServletResponse
對象返回給Host
;
【11】Host
把HttpServletResponse
對象返回給Engine
;
【12】Engine
把HttpServletResponse
對象返回給Connector
;
【13】Connector
把HttpServletResponse
對象返回給客戶browser
;
十五、Tomcat 工作模式
Tomcat
是一個JSP/Servlet
容器。其作為Servlet
容器,有三種工作模式:獨立的Servlet
容器、進程內(nèi)的Servlet
容器和進程外的Servlet
容器。進入Tomcat
的請求可以根據(jù)Tomcat
的工作模式分為如下兩類:
【1】Tomcat
作為應(yīng)用程序服務(wù)器:請求來自于前端的web
服務(wù)器,這可能是Apache
, IIS
, Nginx
等;
【2】Tomcat
作為獨立服務(wù)器:請求來自于web
瀏覽器;
Tomcat
的工作一般分為三種:
【1】bio
: 傳統(tǒng)的Java I/O
操作,同步且阻塞I/O
,一個線程處理一個請求,并發(fā)量高時,線程數(shù)較多,浪費資源;(已經(jīng)很少有人在使用)
【2】nio
: JDK1.4
開始支持,同步阻塞或同步非阻塞IO
,可以通過少量的線程來處理大量的請求;(從Tomcat 8
版本開始默認就是這種模式)
【3】apr
: 以JNI
的形式調(diào)用Apache HTTP
服務(wù)器的核心動態(tài)鏈接庫來處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地提高Tomcat
對靜態(tài)文件的處理性能;(企業(yè)中使用較多)
十六、如何對 Tomcat 進行優(yōu)化
【1】關(guān)閉Manager
管理頁面;(默認已經(jīng)關(guān)閉)
【2】關(guān)閉host-mangent
管理頁面;(默認已經(jīng)關(guān)閉)
【3】對Tomcat
日志進行分割;
【4】定義Tomcat 404
錯誤返回的頁面;
【5】對JVM
進行優(yōu)化;
【6】對Tomcat
線程池進行優(yōu)化;
十七、如何對 Tomcat 進行優(yōu)化
【1】關(guān)閉Manager
管理頁面;(默認已經(jīng)關(guān)閉)
【2】關(guān)閉host-mangent
管理頁面;(默認已經(jīng)關(guān)閉)
【3】對Tomcat
日志進行分割;
【4】定義Tomcat 404
錯誤返回的頁面;
【5】對JVM
進行優(yōu)化;
【6】對Tomcat
線程池進行優(yōu)化;
【7】更改Tomcat
的工作的模式;