溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Tomcat是怎么處理Http請(qǐng)求的

發(fā)布時(shí)間:2021-07-20 11:29:26 來(lái)源:億速云 閱讀:288 作者:chen 欄目:服務(wù)器

本篇內(nèi)容介紹了“Tomcat是怎么處理Http請(qǐng)求的”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Servlet技術(shù)是我們java后端工程師必須掌握的,這里我們可以把java web技術(shù)路線(xiàn)可以大致歸納為如下過(guò)程:

Tomcat是怎么處理Http請(qǐng)求的

因?yàn)閠omcat實(shí)現(xiàn)了Servlet規(guī)范,所以我們得掌握什么是Servlet?什么是Servlet規(guī)范?

什么是Servlet呢?

Servlet是JavaEE規(guī)范的一種,主要是為了擴(kuò)展Java作為Web服務(wù)的功能,統(tǒng)一接口。由其他內(nèi)部廠(chǎng)商如tomcat,jetty內(nèi)部實(shí)現(xiàn)web的功能。如一個(gè)http請(qǐng)求到來(lái):容器將請(qǐng)求封裝為servlet中的HttpServletRequest對(duì)象,調(diào)用init(),service()等方法輸出response,由容器包裝為httpresponse返回給客戶(hù)端的過(guò)程。

Tomcat是怎么處理Http請(qǐng)求的

什么是Servlet規(guī)范?

  • 從 Jar 包上來(lái)說(shuō),Servlet 規(guī)范就是兩個(gè) Jar 文件。servlet-api.jar 和  jsp-api.jar,Jsp 也是一種 Servlet。

  • 從package上來(lái)說(shuō),就是 javax.servlet 和 javax.servlet.http 兩個(gè)包。

  • 從接口來(lái)說(shuō),就是規(guī)范了 Servlet 接口、Filter 接口、Listener 接口、ServletRequest  接口、ServletResponse 接口等。類(lèi)圖如下:

Tomcat是怎么處理Http請(qǐng)求的

為什么我們將tomcat稱(chēng)為Web容器或者Servlet容器 ?

我們用一張圖來(lái)表示他們之間的關(guān)系:

Tomcat是怎么處理Http請(qǐng)求的

簡(jiǎn)單的理解:?jiǎn)?dòng)一個(gè)ServerSocket,監(jiān)聽(tīng)8080端口。Servlet容器用來(lái)裝我們開(kāi)發(fā)的Servlet。

tomcat架構(gòu)介紹

tomcat架構(gòu)圖

Tomcat是怎么處理Http請(qǐng)求的

架構(gòu)圖與tomcat中conf下面的server.xml中內(nèi)容對(duì)比:

<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN">   <Listener className="org.apache.catalina.startup.VersionLoggerListener" />   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />   <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />   <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />   <GlobalNamingResources>     <Resource name="UserDatabase" auth="Container"               type="org.apache.catalina.UserDatabase"               description="User database that can be updated and saved"               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"               pathname="conf/tomcat-users.xml" />   </GlobalNamingResources>   <Service name="Catalina">     <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />     <Engine name="Catalina" defaultHost="localhost">       <Realm className="org.apache.catalina.realm.LockOutRealm">         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"                resourceName="UserDatabase"/>       </Realm>       <Host name="localhost"  appBase="webapps"             unpackWARs="true" autoDeploy="true">         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"                prefix="localhost_access_log" suffix=".txt"                pattern="%h %l %u %t &quot;%r&quot; %s %b" />         <Context docBase="F:/workspace/my-web-maven/target" path="/" reloadable="true" />          <Context docBase="F:/workspace/my-web-maven/target" path="/tian" reloadable="true" />    </Host>     </Engine>   </Service> </Server>

架構(gòu)圖和server.xml內(nèi)容對(duì)比,server.xml就是架構(gòu)圖的xml版本,由此可以猜測(cè)我們java代碼中也應(yīng)該有與之對(duì)應(yīng)的類(lèi)。

比如說(shuō):Listener類(lèi)、Service類(lèi)、Host類(lèi)、Engine類(lèi)等,這個(gè)后面再具體分析,這里只是猜測(cè)一下我們java代碼中的實(shí)現(xiàn)。

看過(guò)前面Mybatis源碼分析文章的同學(xué),這里也應(yīng)該能猜到,這個(gè)server.xml配置文件解析方式以及如何存放這些配置信息。

tomcat啟動(dòng)時(shí)是通過(guò)讀取server.xml配置文件的參數(shù),加載每個(gè)對(duì)應(yīng)的組件,同時(shí)該文件中配置了tomcat的相關(guān)可調(diào)控參數(shù),實(shí)際項(xiàng)目中對(duì)tomcat的優(yōu)化工作大部分都是這個(gè)配置文件里的參數(shù)調(diào)整。

tomcat組件介紹

server

關(guān)于server和tomcat的關(guān)系,可以理解為我們說(shuō)的啟動(dòng)一個(gè)tomcat就是啟動(dòng)一個(gè)server。

作為T(mén)omcat最外層的核心組件,Server組件的作用主要有以下幾個(gè)。

  • 提供了監(jiān)聽(tīng)器機(jī)制,用于在Tomcat整個(gè)生命周期中對(duì)不同事件進(jìn)行處理;

  • 提供了Tomcat容器全局的命名資源實(shí)現(xiàn);

  • 監(jiān)聽(tīng)某個(gè)端口以接收SHUTDOWN命令;

service

Service 表示一個(gè)或多個(gè) Connector 的集合,這些 Connector 共享同一個(gè) Container 來(lái)處理其請(qǐng)求。在同一個(gè)  Tomcat 實(shí)例內(nèi)可以包含任意多個(gè) Service 實(shí)例,它們彼此獨(dú)立

ConnectorConnector用于接受請(qǐng)求并將請(qǐng)求封裝成Request和Response,然后交給Container進(jìn)行處理,Container處理完之后在交給Connector返回給客戶(hù)端。

Container

Container用于封裝和管理Servlet,以及具體處理Request請(qǐng)求;包含4大請(qǐng)求處理組件:引擎(engine)、虛擬主機(jī)、上下文(context)組件。Container是容器的父接口,用于封裝和管理Servlet,以及具體處理Request請(qǐng)求,該容器的設(shè)計(jì)用的是典型的責(zé)任鏈的設(shè)計(jì)模式,它由四個(gè)自容器組件構(gòu)成,分別是Engine、Host、Context、Wrapper。這四個(gè)組件是負(fù)責(zé)關(guān)系,存在包含關(guān)系。只包含一個(gè)引擎。

Engine

表示整個(gè) Servlet 引擎。在 Tomcat 中, Engine 為最高層級(jí)的容器對(duì)象。盡管 Engine  不是直接處理請(qǐng)求的容器,卻是獲取目標(biāo)容器的入口。引擎表示可運(yùn)行的Catalina的servlet引擎實(shí)例,并且包含了servlet容器的核心功能。在一個(gè)服務(wù)中只能有一個(gè)引擎。同時(shí),作為一個(gè)真正的容器,Engine元素之下可以包含一個(gè)或多個(gè)虛擬主機(jī)Host。

Host

代表一個(gè)站點(diǎn),也可以叫虛擬主機(jī),通過(guò)配置Host就可以添加站點(diǎn)。Host容器是Engine容器的子容器,上面也說(shuō)到Host是受Engine容器管理的,就是指一個(gè)虛擬主機(jī),比如我們?cè)谠L(fǎng)問(wèn)具體jsp頁(yè)面URL中l(wèi)ocalhost就是一個(gè)虛擬主機(jī),其作用是運(yùn)行多個(gè)應(yīng)用,并對(duì)這些應(yīng)用進(jìn)行管理,其子容器是Context,而且一個(gè)主機(jī)還保存了主機(jī)的相關(guān)信息。

Context

Context 作為一類(lèi)容器,用于表示 Servletcontext ,在 Servlet 規(guī)范中,一個(gè) Servletcontext  即表示一個(gè)獨(dú)立的 Web 應(yīng)用。代表一個(gè)應(yīng)用程序,對(duì)應(yīng)著平時(shí)研發(fā)的一套程序,或者WEB-INF目錄以及下面的web.xml文件 。

WapperWapper 作為一類(lèi)容器,用于表示 Web 應(yīng)用中定義的 Servlet,每一個(gè)Wrapper封裝這一個(gè)Servlet。

組件關(guān)系

Tomcat是怎么處理Http請(qǐng)求的

tomcat兩個(gè)核心組件

Connector:主要負(fù)責(zé)處理Socket連接,以及Request與Response的轉(zhuǎn)化。

Container:包括Engine、Host、Context和Wrapper,主要負(fù)責(zé)內(nèi)部的處理以及Servlet的管理

tomcat處理Http請(qǐng)求流程

上面說(shuō)完了tomcat整體架構(gòu),下面我們來(lái)說(shuō)說(shuō),假設(shè)來(lái)我們?cè)跒g覽器上輸入

http://localhost:8080/my-web-mave/index.jsp

在tomcat中是如何處理這個(gè)請(qǐng)求流程的:

  1. 我們的請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里偵聽(tīng)的Coyote HTTP/1.1 Connector獲得。

  2. Connector把該請(qǐng)求交給它所在的Service的Engine來(lái)處理,并等待來(lái)自Engine的回應(yīng) 。

  3. Engine獲得請(qǐng)求localhost/my-web-maven/index.jsp,匹配它所擁有的所有虛擬主機(jī)Host  ,我們的虛擬主機(jī)在server.xml中默認(rèn)配置的就是localhost。

  4. Engine匹配到name=localhost的Host(即使匹配不到也把請(qǐng)求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))。

  5. localhost Host獲得請(qǐng)求/my-web-maven/index.jsp,匹配它所擁有的所有Context。

  6. Host匹配到路徑為/my-web-maven的Context(如果匹配不到就把該請(qǐng)求交給路徑名為”"的Context去處理)。

  7. path=”/my-web-maven”的Context獲得請(qǐng)求/index.jsp,在它的mapping table中尋找對(duì)應(yīng)的servlet  。

  8. Context匹配到URL PATTERN為*.jsp的servlet,對(duì)應(yīng)于JspServlet類(lèi)。

  9. 構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法  。

  10. Context把執(zhí)行完了之后的HttpServletResponse對(duì)象返回給Host 。

  11. Host把HttpServletResponse對(duì)象返回給Engine 。

  12. Engine把HttpServletResponse對(duì)象返回給Connector 。

  13. Connector把HttpServletResponse對(duì)象返回給客戶(hù)browser 。流程圖:有些模糊。

Tomcat是怎么處理Http請(qǐng)求的

“Tomcat是怎么處理Http請(qǐng)求的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI