您好,登錄后才能下訂單哦!
本篇內(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ò)程:
因?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ò)程。
什么是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稱(chēng)為Web容器或者Servlet容器 ?
我們用一張圖來(lái)表示他們之間的關(guān)系:
簡(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)圖
架構(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 "%r" %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兩個(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)求流程的:
我們的請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里偵聽(tīng)的Coyote HTTP/1.1 Connector獲得。
Connector把該請(qǐng)求交給它所在的Service的Engine來(lái)處理,并等待來(lái)自Engine的回應(yīng) 。
Engine獲得請(qǐng)求localhost/my-web-maven/index.jsp,匹配它所擁有的所有虛擬主機(jī)Host ,我們的虛擬主機(jī)在server.xml中默認(rèn)配置的就是localhost。
Engine匹配到name=localhost的Host(即使匹配不到也把請(qǐng)求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))。
localhost Host獲得請(qǐng)求/my-web-maven/index.jsp,匹配它所擁有的所有Context。
Host匹配到路徑為/my-web-maven的Context(如果匹配不到就把該請(qǐng)求交給路徑名為”"的Context去處理)。
path=”/my-web-maven”的Context獲得請(qǐng)求/index.jsp,在它的mapping table中尋找對(duì)應(yīng)的servlet 。
Context匹配到URL PATTERN為*.jsp的servlet,對(duì)應(yīng)于JspServlet類(lèi)。
構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法 。
Context把執(zhí)行完了之后的HttpServletResponse對(duì)象返回給Host 。
Host把HttpServletResponse對(duì)象返回給Engine 。
Engine把HttpServletResponse對(duì)象返回給Connector 。
Connector把HttpServletResponse對(duì)象返回給客戶(hù)browser 。流程圖:有些模糊。
“Tomcat是怎么處理Http請(qǐng)求的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(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)容。