來(lái)源:北大青鳥(niǎo)總部 2023年08月30日 09:10
作為一個(gè)web開(kāi)發(fā)者,自打進(jìn)入這一行,每天接觸最多的可能就是服務(wù)器了,每天最多的操作可能就是啟動(dòng)服務(wù)器,關(guān)掉服務(wù)器,各種測(cè)試操作。
很多時(shí)候,對(duì)它是又愛(ài)又恨,愛(ài)的是它確實(shí)是我們做web開(kāi)發(fā)必不可少的東西,而且很優(yōu)秀;恨的是,每天都要經(jīng)常啟動(dòng),停止;不厭其煩的操作。
雖然我們每天都在使用Tomcat服務(wù)器,大家就是知道這是一個(gè)很好用的服務(wù)器,但是我猜很多開(kāi)發(fā)者肯能并不一定清楚的它的來(lái)歷,也未必對(duì)它的原理有過(guò)研究。
提到Tomcat,大家可能最先想到的就是一只可愛(ài)的小貓咪,但是你沒(méi)有想過(guò),這個(gè)為什么一個(gè)服務(wù)器會(huì)和一致可愛(ài)的小貓咪聯(lián)系在一起呢,好像八竿子也打不著的親戚,所以,今天咱們就來(lái)了解下Tomcat的前世今生......
· Tomcat的由來(lái)
Tomcat 服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源的Web應(yīng)用服務(wù)器,屬于輕量級(jí)應(yīng)用服務(wù)器,廣泛應(yīng)用于web開(kāi)發(fā),深受廣大開(kāi)發(fā)者喜愛(ài),是目前比較流行的Web應(yīng)用服務(wù)器。
Tomcat是Apache 軟件基金會(huì)(ApacheSoftwareFoundation)的一個(gè)核心項(xiàng)目,Tomcat最初是由Sun的軟件架構(gòu)師詹姆斯·鄧肯·戴維森開(kāi)發(fā)的,并由Sun貢獻(xiàn)給Apache軟件基金會(huì)。由Apache Sun和其他一些公司及個(gè)人共同開(kāi)發(fā)而成。由于有了Sun的參與和支持,最新的Servlet和JSP規(guī)范總是能在Tomcat中得到體現(xiàn)。
但是人們不禁對(duì)這個(gè)Tomcat和小貓咪的關(guān)系感到好奇,Tomcat的這個(gè)單詞是“公貓/野貓”的意思,因?yàn)樗拈_(kāi)發(fā)者姆斯·鄧肯·戴維森希望用一種能夠自己照顧自己的動(dòng)物代表這個(gè)軟件,于是命名為tomcat,它的Logo兼吉祥物也被設(shè)計(jì)成了一只公貓形象。還有就是,具說(shuō)姆斯·鄧肯·戴維森在擼代碼的時(shí)候,他養(yǎng)的小貓總是在他的鍵盤上跳來(lái)跳去,所有就多種因素在一起,就有了今天的Tomcat.
但其實(shí),在Tomcat里還有另外一些有意思的故事,比如Tomcat中最核心的模塊Servlet,在它的作者開(kāi)發(fā)這個(gè)模塊的時(shí)候,就給他起了聽(tīng)上去都很美的名字Catalina,這個(gè)單詞的意思是“卡特琳娜”,沒(méi)錯(cuò),它就是一個(gè)連作者自己的都沒(méi)去過(guò)的美麗的小島,果然得不到的永遠(yuǎn)在騷動(dòng)~~~
好了,關(guān)于Tomcat的由來(lái)的故事基本就這么多吧,感覺(jué)還是跟很多軟件的故事類似,要么起個(gè)地名,要么起個(gè)動(dòng)物名。
· Tomcat的原理
Tomcat 作為一個(gè)Http服務(wù)器 +Servlet容器,屏蔽了很多應(yīng)用層協(xié)議和網(wǎng)絡(luò)通信細(xì)節(jié),給我們的是標(biāo)準(zhǔn)的Request和 Response對(duì)象,當(dāng)我們?cè)谑褂肧pringMVC之類的框架的時(shí)候,從來(lái)都不考慮一個(gè)請(qǐng)求的具體的實(shí)現(xiàn)細(xì)節(jié),就是因?yàn)?Tomcat已經(jīng)為我們做好了這些,我們只需要關(guān)注每個(gè)請(qǐng)求的具體業(yè)務(wù)邏輯。
說(shuō)到這些實(shí)現(xiàn)細(xì)節(jié),可是復(fù)雜了,我們先從整體整體架構(gòu)上來(lái)看下Tomcat的總體結(jié)構(gòu)。
從上圖中可以看出 Tomcat有很多組件,但是比較核心的是Connector和Container兩個(gè)組件,這兩個(gè)組件分別控制著Tomcat于外界的聯(lián)系,一個(gè)控制著Tomcat的生命周期。
Connector(連接器) :Tomcat 與外部世界的連接器,監(jiān)聽(tīng)固定端口接收外部請(qǐng)求,傳遞給 Container,并 將 Container 處理的結(jié)果返回給外部
Container(容器):Catalina,Servlet 容器,內(nèi)部有多層容器組成,用于管理 Servlet 生命周期,調(diào)用 servlet 相關(guān)方法
Server(服務(wù)器):代表Tomcat本身,用來(lái)接收客戶端發(fā)請(qǐng)求數(shù)據(jù)并進(jìn)行解析,啟動(dòng)service并監(jiān)聽(tīng)端口等
Service(服務(wù)器):它負(fù)責(zé)管理一個(gè) Servlet,包括的 Servlet 的裝載、初始化、執(zhí)行以及資源回收
Engine(引擎):表示可運(yùn)行的Catalina的servlet引擎實(shí)例,負(fù)責(zé)請(qǐng)求 的處理。
Context(上下文容器):也可以看成Web應(yīng)用。Context上下文代表 Servlet 的 Context,它具備了 Servlet 運(yùn)行的基本環(huán)境,它表示W(wǎng)eb應(yīng)用程序本身
Host(虛擬主機(jī)):是web應(yīng)用容器或者是Tomcat中所說(shuō)的上下文虛擬主機(jī)
Wrapper(包裝器):表示一個(gè)單獨(dú)的servlet,負(fù)責(zé)管理一個(gè) Servlet,包括的 Servlet 的裝載、初始化、執(zhí)行以及資源回收
· Tomcat的處理流程
說(shuō)完了Tomcat的核心組件,我們?cè)賮?lái)看下Tomcat的處理流程,當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)之后,Tomcat是怎么處理的,我們上面介紹到的這些組件優(yōu)勢(shì)怎么發(fā)揮作用的,我們先來(lái)看一張圖。
1、用戶點(diǎn)擊網(wǎng)頁(yè)內(nèi)容,請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里監(jiān)聽(tīng)的Coyote HTTP/1.1 Connector獲得
2、Connector把該請(qǐng)求交給它所在的Service的Engine來(lái)處理,并等待Engine的響應(yīng)
3、Engine獲得請(qǐng)求localhost/index.jsp,匹配所有的虛擬主機(jī)Host
4、Engine匹配到名為localhost的Host(即使匹配不到也把請(qǐng)求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī)),名為localhost的Host獲得請(qǐng)求/index.jsp,匹配它所擁有的所有的Context。Host匹配到路徑為/的Context(如果匹配不到就把該請(qǐng)求交給路徑名為“ ”的Context去處理)
5、path=“/”的Context獲得請(qǐng)求/index.jsp,在它的mapping table中尋找出對(duì)應(yīng)的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet, 對(duì)應(yīng)于JspServlet類
6、構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet()或doPost(),執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等程序
7、Context把執(zhí)行完之后的HttpServletResponse對(duì)象返回給Host
8、Host把HttpServletResponse對(duì)象返回給Engine
9、Engine把HttpServletResponse對(duì)象返回Connector
10、Connector把HttpServletResponse對(duì)象返回給客戶Browser
最終將處理后的結(jié)果,渲染之后返回給瀏覽器,這樣一個(gè)請(qǐng)求就算完成啦!