這篇文章主要講解了“Tomcat整體架構(gòu)是怎樣的”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Tomcat整體架構(gòu)是怎樣的”吧!
成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,成都創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!
整體架構(gòu)
我們想要了解一個(gè)框架,首先要了解它是干什么的,Tomcat我們都知道,是用于處理連接過來的Socket請(qǐng)求的。那么Tomcat就會(huì)有兩個(gè)功能:
對(duì)外處理連接,將收到的字節(jié)流轉(zhuǎn)化為自己想要的Request和Response對(duì)象
對(duì)內(nèi)處理Servlet,將對(duì)應(yīng)的Request請(qǐng)求分發(fā)到相應(yīng)的Servlet中
那么我們整體的骨架就出來了,Tomcat其實(shí)就分為兩大部分,一部分是連接器(Connnector)處理對(duì)外連接和容器(Container)管理對(duì)內(nèi)的Servelet。大體的關(guān)系圖如下
最外層的大框就是代表一個(gè)Tomcat服務(wù),一個(gè)Tomcat服務(wù)可以對(duì)應(yīng)多個(gè)Service。每個(gè)Service都有連接器和容器。這些對(duì)應(yīng)的關(guān)系我們也可以打開在Tomcat目錄配置文件中server.xml中看出來。
這里我將其中配置文件中刪除了一些內(nèi)容精簡(jiǎn)了一下,這里我們可以看到連接器其實(shí)就是Connector,一個(gè)Service中可以有多個(gè)連接器,容器其實(shí)對(duì)應(yīng)的就是Engine。
Tomcat的整體架構(gòu)簡(jiǎn)單來說就是這樣的對(duì)應(yīng)關(guān)系。接下來我們簡(jiǎn)單的介紹連接器的整體架構(gòu)和容器的整體架構(gòu)。
連接器
我們可以看到上圖中連接器傳給容器的是ServletRequest對(duì)象,而容器傳給連接器的是ServletResponse對(duì)象,這些在網(wǎng)絡(luò)傳輸過程中是肯定不行的,因?yàn)榫W(wǎng)絡(luò)傳輸中傳送的字節(jié)流。所以連接器的功能需求我們大概能總結(jié)出來以下幾點(diǎn)。
Socket連接
讀取請(qǐng)求網(wǎng)絡(luò)中的字節(jié)流
根據(jù)相應(yīng)的協(xié)議(Http/AJP)解析字節(jié)流,生成統(tǒng)一的Tomcat Requestt對(duì)象
將Tomcat Reques傳給容器
容器返回Tomcat Response對(duì)象
將Tomcat Response對(duì)象轉(zhuǎn)換為字節(jié)流
將字節(jié)流返回給客戶端
其實(shí)上面的細(xì)分都能總結(jié)為以下的三點(diǎn)
網(wǎng)絡(luò)通信
應(yīng)用層協(xié)議的解析
Tomcat的Request/Response與ServletRequest/ServletResponse對(duì)象的轉(zhuǎn)化
而在Tomcat中它也用了三個(gè)類來實(shí)現(xiàn)上面的三個(gè)功能,分別對(duì)應(yīng)如下
EndPoint
Processor
Adapter
用圖表示他們的關(guān)系的話就是這樣
容器
容器,顧名思義就是裝東西的器具,那么這個(gè)Tomcat容器是裝什么的呢?其實(shí)主要的就是裝了Servlet的。那么容器是如何設(shè)計(jì)的呢?Tomcat的容器設(shè)計(jì)其實(shí)是用了組合設(shè)計(jì)模式(不了解組合設(shè)計(jì)模式的可以看我之前的文章不學(xué)無數(shù)——組合模式)。其實(shí)從Server.xml中我們也能看到其關(guān)系了。
復(fù)制代碼
在這里面我們只能看到容器中的兩個(gè)模塊,一個(gè)是頂層模塊Engine,另一個(gè)是Host,其實(shí)還有兩個(gè)模塊,一個(gè)是Context對(duì)應(yīng)的是我們webapp里面的每個(gè)應(yīng)用文件夾,每個(gè)文件夾就是對(duì)應(yīng)一個(gè)Context,還有一個(gè)模塊Wrapper對(duì)應(yīng)的是我們Context中的所有servlet,Wrapper管理了訪問關(guān)系與具體的Servlet的對(duì)應(yīng)。圖表示就是下面這樣。
Tomcat中容器所有模塊都實(shí)現(xiàn)了Container接口,而組合模式的意義就是使得用戶對(duì)于單個(gè)對(duì)象和組合對(duì)象的使用具有一致性,即無論添加多少個(gè)Context其使用就是為了找到其下面的Servlet,而無論添加多少個(gè)Host也是為了找個(gè)下面的Servlet。而在容器中設(shè)計(jì)了這么多的模塊,一個(gè)請(qǐng)求過來Tomcat如何找到對(duì)應(yīng)的Servlet進(jìn)行處理呢?
請(qǐng)求如何定位
我們就舉個(gè)最簡(jiǎn)單的例子,我們本機(jī)應(yīng)用上啟動(dòng)了一個(gè)Tomcat,webapp下有我們部署的一個(gè)應(yīng)用buxuewushu。我們?cè)跒g覽器上輸入http://localhost:8080/buxuewushu/add.do是如何找到對(duì)應(yīng)Servlet進(jìn)行處理呢?
在我們啟動(dòng)Tomcat的時(shí)候,連接器就會(huì)進(jìn)行初始化監(jiān)聽所配置的端口號(hào),這里我們配置的是8080端口對(duì)應(yīng)的協(xié)議是HTTP。
請(qǐng)求發(fā)送到本機(jī)的8080端口,被在那里監(jiān)聽的HTTP/1.1的連接器Connector獲得
連接器Connector將字節(jié)流轉(zhuǎn)換為容器所需要的ServletRequest對(duì)象給同級(jí)Service下的容器模塊Engine進(jìn)行處理
Engine獲得地址http://localhost:8080/buxuewushu/add。匹配他下面的Host主機(jī)
匹配到名為localhost的Host(就算此時(shí)請(qǐng)求為具體的ip,沒有配置相應(yīng)的Host,也會(huì)交給名為localhost的Host進(jìn)行處理,因?yàn)樗悄J(rèn)的主機(jī))
Host匹配到路徑為/buxuewushu的Context,即在webapp下面找到相應(yīng)的文件夾
Context匹配到URL規(guī)則為*.do的servlet,對(duì)應(yīng)為某個(gè)Servlet類
調(diào)用其doGet或者doPost方法
Servlet執(zhí)行完以后將對(duì)象返回給Context
Context返回給Host
Host返回給Engine
Engine返回給連接器Connector
連接器Connector將對(duì)象解析為字節(jié)流發(fā)送給客戶端
感謝各位的閱讀,以上就是“Tomcat整體架構(gòu)是怎樣的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Tomcat整體架構(gòu)是怎樣的這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!