本文章基于 8.5.50 版本的 Tomcat 剖析。

第?部分 Tomcat 系統(tǒng)架構(gòu)與原理剖析1、http請求的處理流程

注意:瀏覽器訪問服務器使用的是HTTP協(xié)議。H" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 中間件01--Tomcat

中間件01--Tomcat

時間:2023-07-15 07:06:01 | 來源:網(wǎng)站運營

時間:2023-07-15 07:06:01 來源:網(wǎng)站運營

中間件01--Tomcat:本篇文章內(nèi)容借鑒于拉勾教育Java高薪訓練營課程。

本文章基于 8.5.50 版本的 Tomcat 剖析。

第?部分 Tomcat 系統(tǒng)架構(gòu)與原理剖析

1、http請求的處理流程

注意:瀏覽器訪問服務器使用的是HTTP協(xié)議。HTTP是應用層協(xié)議,用于定義數(shù)據(jù)通信的格式,具體數(shù)據(jù)傳輸使用的是TCP/IP協(xié)議。

2、Tomcat兩個重要身份

Tomcat既按照Servlet規(guī)范的要求去實現(xiàn)了servlet容器,同時它也具備HTTP服務器的功能。

1)Tomcat能夠接收并處理HTTP請求,所以Tomcat是一個HTTP服務;

2)Tomcat是一個servlet容器:HTTP服務器接收到請求后不會直接去調(diào)用具體的程序(Java類)進行處理,而是把請求交給Servlet容器來處理,,這樣Tomcat和業(yè)務類就不會耦合在一起。Servlet容器通過Servlet接口調(diào)用業(yè)務類,Servlet接口和Servlet容器這一整套內(nèi)容叫做Servlet規(guī)范。

Tomcat模型
3、Tomcat Servlet容器處理流程

當用戶請求某個URL資源時

1)HTTP服務器會把請求信息用ServletRequest對象封裝起來,進一步去調(diào)用Servlet容器中某個具體的Servlet;,2)Servlet容器拿到請求后,根據(jù)URL和Servlet的映射關系,找到相應的servlet;3) 如果servlet還沒有被加載,就用反射機制創(chuàng)建這個Servlet,并調(diào)用Servlet的init方法來初始化;4)接著調(diào)用具體Servlet的service方法來處理請求,請求處理結(jié)果使用ServletResponse封裝;5)把ServletResponse對象返回給HTTP服務器,HTTP服務器會把響應發(fā)送給客戶端。4、Tomcat 系統(tǒng)總體架構(gòu)

Tomcat 設計了兩個核?組件連接器(Connector)和容器(Container)來完成 Tomcat 的兩?核?功能。

連接器,負責對外交流: 處理Socket連接,負責?絡字節(jié)流與Request和Response對象的轉(zhuǎn)化;

容器,負責內(nèi)部處理:加載和管理Servlet,以及處理Request請求;

5、Tomcat 連接器組件 Coyote

5.1、Coyote 簡介

Coyote 是Tomcat 中連接器的組件名稱 , 是對外的接???蛻舳送ㄟ^Coyote與服務器建?連接、發(fā)送請求并接受響應 。

(1)Coyote 封裝了底層的?絡通信(Socket 請求及響應處理);(2)Coyote 使Catalina 容器(容器組件)與具體的請求協(xié)議及IO操作?式完全解耦;(3)Coyote 將Socket 輸?轉(zhuǎn)換封裝為 Request 對象,進?步封裝后交由Catalina 容器進?處理,處理請求完成后, Catalina 通過Coyote 提供的Response 對象將結(jié)果寫?輸出流;(4)Coyote 負責的是具體協(xié)議(應?層)和IO(傳輸層)相關內(nèi)容;Tomcat?持多種應?層協(xié)議和I/O模型,如下:

在 8.0 之前 ,Tomcat 默認采?的I/O?式為 BIO,之后改為 NIO。 ?論 NIO、NIO2 還是 APR, 在性能??均優(yōu)于以往的BIO。 如果采?APR, 甚?可以達到 Apache HTTP Server 的影響性能。

5.2、Coyote 的內(nèi)部組件及流程

組件作用描述
EndPointEndPoint 是 Coyote 通信端點,即通信監(jiān)聽的接?,是具體Socket接收和發(fā)
送處理器,是對傳輸層的抽象,因此EndPoint?來實現(xiàn)TCP/IP協(xié)議的
ProcessorProcessor 是Coyote 協(xié)議處理接? ,如果說EndPoint是?來實現(xiàn)TCP/IP協(xié)
議的,那么Processor?來實現(xiàn)HTTP協(xié)議,Processor接收來?EndPoint的Socket,讀取字節(jié)流解析成Tomcat Request和Response對象,并通過Adapter將其提交到容器處理,Processor是對應?層協(xié)議的抽象
ProtocolHandlerCoyote 協(xié)議接?, 通過Endpoint 和 Processor , 實現(xiàn)針對具體協(xié)議的處
理能?。Tomcat 按照協(xié)議和I/O 提供了6個實現(xiàn)類 : AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol
Adapter由于協(xié)議不同,客戶端發(fā)過來的請求信息也不盡相同,Tomcat定義了??的
Request類來封裝這些請求信息。ProtocolHandler接?負責解析請求并?成Tomcat Request類。但是這個Request對象不是標準的ServletRequest,不能?Tomcat Request作為參數(shù)來調(diào)?容器。Tomcat設計者的解決?案是引?CoyoteAdapter,這是適配器模式的經(jīng)典運?,連接器調(diào)?CoyoteAdapter的Sevice?法,傳?的是Tomcat Request對象,CoyoteAdapter負責將Tomcat Request轉(zhuǎn)成ServletRequest,再調(diào)?容器



6、Tomcat Servlet 容器 Catalina

6.1 Tomcat 模塊分層結(jié)構(gòu)圖及Catalina位置

Tomcat是?個由?系列可配置(conf/server.xml)的組件構(gòu)成的Web容器,?Catalina是Tomcat的servlet容器。

從另?個?度來說,Tomcat 本質(zhì)上就是?款 Servlet 容器, 因為 Catalina 才是 Tomcat 的核? , 其他模塊都是為Catalina 提供?撐的。 ?如 : 通過 Coyote 模塊提供鏈接通信,Jasper 模塊提供 JSP 引擎,Naming 提供JNDI 服務,Juli 提供?志服務。

6.2 Servlet 容器 Catalina 的結(jié)構(gòu)

我們可以認為整個Tomcat就是?個Catalina實例,Tomcat 啟動的時候會初始化這個實例,Catalina實例通過加載server.xml完成其他實例的創(chuàng)建,創(chuàng)建并管理?個Server,Server創(chuàng)建并管理多個服務,每個服務?可以有多個Connector和?個Container。

?個Catalina實例(容器)

?個 Server實例(容器)

多個Service實例(容器)

每?個Service實例下可以有多個Connector實例和?個Container實例


Catalina:Catalina負責解析Tomcat的配置?件(server.xml) , 以此來創(chuàng)建服務器Server組件并進?管理;

Server:Server服務器表示整個Catalina Servlet容器以及其它組件,負責組裝并啟動Servlet引擎,Tomcat連接器。Server通過實現(xiàn)Lifecycle接?,提供了?種優(yōu)雅的啟動和關閉整個系統(tǒng)的?式;

Service:Service服務是Server內(nèi)部的組件,?個Server包含多個Service。它將若?個Connector組件綁定到?個Container;

Container:Container容器,負責處理?戶的servlet請求,并返回對象給web?戶的模塊;

6.3 Container 組件的具體結(jié)構(gòu)

Container組件下有?種具體的組件,分別是Engine、Host、Context和Wrapper。這4種組件(容器)是??關系。Tomcat通過?種分層的架構(gòu),使得Servlet容器具有很好的靈活性。

Engine:表示整個Catalina的Servlet引擎,?來管理多個虛擬站點,?個Service最多只能有?個Engine,但是?個引擎可包含多個Host;

Host:代表?個虛擬主機,或者說?個站點,可以給Tomcat配置多個虛擬主機地址,??個虛擬主機下可包含多個Context;

Context:表示?個Web應?程序, ?個Web應?可包含多個Wrapper;

Wrapper:表示?個Servlet,Wrapper 作為容器中的最底層,不能包含?容器;

上述組件的配置其實就體現(xiàn)在conf/server.xml中。

第?部分 Tomcat 服務器核?配置詳解

注意:

Tomcat 作為服務器的配置,主要是 server.xml ?件的配置;

server.xml中包含了 Servlet容器的相關配置,即 Catalina 的配置;

Xml ?件的講解主要是標簽的使?。

主要標簽結(jié)構(gòu)如下:

<!--Server 根元素,創(chuàng)建?個Server實例,?標簽有 Listener、GlobalNamingResources、Service--><Server> <!--定義監(jiān)聽器--> <Listener/> <!--定義服務器的全局JNDI資源 --> <GlobalNamingResources/> <!--定義?個Service服務,?個Server標簽可以有多個Service服務實例--> <Service/></Server>1、Server 標簽

<!-- port:關閉服務器的監(jiān)聽端? shutdown:關閉服務器的指令字符串--><Server port="8005" shutdown="SHUTDOWN"><!-- 以?志形式輸出服務器 、操作系統(tǒng)、JVM的版本信息 --><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" />--><!--APR library loader. Documentation at /docs/apr.html --><!-- 加載(服務器啟動) 和 銷毀 (服務器停?) APR。 如果找不到APR庫, 則會輸出?志,并不影響 Tomcat啟動 --><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><!-- Prevent memory leaks due to use of particular java/javax APIs--><!-- 避免JRE內(nèi)存泄漏問題 --><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><!-- 加載(服務器啟動) 和 銷毀(服務器停?) 全局命名服務 --><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><!-- 在Context停?時重建 Executor 池中的線程, 以避免ThreadLocal 相關的內(nèi)存泄漏 --><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /><!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html GlobalNamingResources 中定義了全局命名服務--><GlobalNamingResources><!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users--> <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><!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level.Documentation at /docs/config/service.html--><Service name="Catalina">...</Service></Server>2、Service 標簽

<!-- 該標簽?于創(chuàng)建 Service 實例,默認使? org.apache.catalina.core.StandardService。 默認情況下,Tomcat 僅指定了Service 的名稱, 值為 "Catalina"。 Service ?標簽為 : Listener、Executor、Connector、Engine, 其中: Listener ?于為Service添加?命周期監(jiān)聽器, Executor ?于配置Service 共享線程池, Connector ?于配置Service 包含的鏈接器, Engine ?于配置Service中鏈接器對應的Servlet 容器引擎--><Service name="Catalina">...</Service>3、Executor 標簽

<!-- 默認情況下,Service 并未添加共享線程池配置。 如果我們想添加?個線程池, 可以在 <Service> 下添加如下配置: name:線程池名稱,?于 Connector中指定 namePrefix:所創(chuàng)建的每個線程的名稱前綴,?個單獨的線程名稱為 namePrefix+threadNumber maxThreads:池中最?線程數(shù) minSpareThreads:活躍線程數(shù),也就是核?池線程數(shù),這些線程不會被銷毀,會?直存在 maxIdleTime:線程空閑時間,超過該時間后,空閑線程會被銷毀,默認值為6000(1分鐘),單位毫秒 maxQueueSize:在被執(zhí)?前最?線程排隊數(shù)?,默認為Int的最?值,也就是?義的?限。除?特殊情況,這個值 不需要更改,否則會有請求不會被處理的情況發(fā)? prestartminSpareThreads:啟動線程池時是否啟動 minSpareThreads部分線程。默認值為false,即不啟動 threadPriority:線程池中線程優(yōu)先級,默認值為5,值從1到10 className:線程池實現(xiàn)類,未指定情況下,默認實現(xiàn)類為org.apache.catalina.core.StandardThreadExecutor。如果想使??定義線程池?先需要實現(xiàn)org.apache.catalina.Executor接?--><Executor name="commonThreadPool"namePrefix="thread-exec-"maxThreads="200"minSpareThreads="100"maxIdleTime="60000"maxQueueSize="Integer.MAX_VALUE"prestartminSpareThreads="false"threadPriority="5"className="org.apache.catalina.core.StandardThreadExecutor"/>4、Connector 標簽

Connector 標簽?于創(chuàng)建鏈接器實例默認情況下,server.xml 配置了兩個鏈接器,?個?持HTTP協(xié)議,?個?持AJP協(xié)議。?多數(shù)情況下,我們并不需要新增鏈接器配置,只是根據(jù)需要對已有鏈接器進?優(yōu)化;

<!-- port:端?號,Connector ?于創(chuàng)建服務端Socket 并進?監(jiān)聽, 以等待客戶端請求鏈接。如果該屬性設置為0, Tomcat將會隨機選擇?個可?的端?號給當前Connector 使? protocol:當前Connector ?持的訪問協(xié)議。 默認為 HTTP/1.1 , 并采??動切換機制選擇?個基于 JAVA NIO 的鏈接器或者基于本地APR的鏈接器(根據(jù)本地是否含有Tomcat的本地庫判定) connectionTimeOut:Connector 接收鏈接后的等待超時時間, 單位為 毫秒。 -1 表示不超時。 redirectPort:當前Connector 不?持SSL請求, 接收到了?個請求, 并且也符合security-constraint 約束,需要SSL傳輸,Catalina?動將請求重定向到指定的端?。 executor:指定共享線程池的名稱, 也可以通過maxThreads、minSpareThreads 等屬性配置內(nèi)部線程池。可以使?共享線程池 Engine 標簽:Engine 表示 Servlet 引擎 Host 標簽:Host 標簽?于配置?個虛擬主機 URIEncoding: ?于指定編碼URI的字符編碼, Tomcat8.x版本默認的編碼為 UTF-8 , Tomcat7.x版本默認為ISO-8859-1--><!--org.apache.coyote.http11.Http11NioProtocol , ?阻塞式 Java NIO 鏈接器--><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />可以使?共享線程池

<Connector port="8080" protocol="HTTP/1.1" executor="commonThreadPool" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" connectionTimeout="20000" compression="on" compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443" URIEncoding="UTF-8" />5、Engine 標簽

Engine 表示 Servlet 引擎

<!--name:?于指定Engine 的名稱, 默認為Catalina;defaultHost:默認使?的虛擬主機名稱, 當客戶端請求指向的主機?效時, 將交由默認的虛擬主機處理, 默認為localhost--><Engine name="Catalina" defaultHost="localhost">...</Engine>6、Host 標簽

Host 標簽?于配置?個虛擬主機

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">...</Host>7、Context 標簽

Context 標簽?于配置?個Web應?,如下:

<Host name="www.abc.com" appBase="webapps" unpackWARs="true" autoDeploy="true"><!-- docBase:Web應??錄或者War包的部署路徑??梢允墙^對路徑,也可以是相對于 Host appBase的相對路徑。 path:Web應?的Context 路徑。如果我們Host名為localhost, 則該web應?訪問的根路徑為: http://localhost:8080/web_demo。--><Context docBase="/Users/yingdian/web_demo" path="/web3"></Context><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /></Host>

第三部分 Tomcat 類加載機制剖析

Tomcat 類加載機制是在 Jvm 類加載機制基礎之上進?了?些變動。沒有嚴格的遵從雙親委派機制,也可以說打破了雙親委派機制。







tomcat 8.5 默認改變了嚴格的雙親委派機制

1、?先從 Bootstrap Classloader加載指定的類2、如果未加載到,則從 /WEB-INF/classes加載3、如果未加載到,則從 /WEB-INF/lib/*.jar 加載4、如果未加載到,則依次從 System、Common、Shared 加載(在這最后?步,遵從雙親委派機制)

第四部分 Tomcat的 HTTP和Https 相關內(nèi)容

1、Tomcat處理HTTP請求流程

上面說完了tomcat整體架構(gòu),下面我們來說說,假設來我們在瀏覽器上輸入

http://localhost:8080/my-web-mave/index.jsp,在tomcat中是如何處理這個請求流程的:

1:我們的請求被發(fā)送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得。2:Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應 。3:Engine獲得請求localhost/my-web-maven/index.jsp,匹配它所擁有的所有虛擬主機Host ,我們的虛擬主機在server.xml中默認配置的就是localhost。4:Engine匹配到name=localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)。5:localhost Host獲得請求/my-web-maven/index.jsp,匹配它所擁有的所有Context。6:Host匹配到路徑為/my-web-maven的Context。7:path=”/my-web-maven”的Context獲得請求/index.jsp,在它的mapping table中尋找對應的servlet 。8:Context匹配到URL PATTERN為*.jsp的servlet,對應于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 。


2、HTTPSHTTP的主要區(qū)別

1、HTTPS協(xié)議使?時需要到電?商務認證授權(quán)機構(gòu)(CA)申請SSL證書;2、HTTP默認使?8080端?,HTTPS默認使?8443端?;3、HTTPS則是具有SSL加密的安全性傳輸協(xié)議,對數(shù)據(jù)的傳輸進?加密,效果上相當于HTTP的升級版;4、HTTP的連接是?狀態(tài)的,不安全的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進?加密傳輸、身份認證的?絡協(xié)議,?HTTP協(xié)議安全。3、HTTPS?作原理大致流程:

說明:HTTPS在傳輸數(shù)據(jù)之前需要客戶端與服務端進行一次握手,在握手過程中將確定雙方加密傳輸數(shù)據(jù)的密碼信息;

附:Tomcat各文件夾的作用

1、bin目錄主要是用來存放tomcat的命令,主要有兩大類,一類是以.sh結(jié)尾的(linux命令),另一類是以.bat結(jié)尾的(windows命令)。很多環(huán)境變量的設置都在此處。2、conf目錄主要是用來存放tomcat的一些配置文件。 server.xml可以設置端口號、設置域名或IP、默認加載的項目、請求編碼 web.xml可以設置tomcat支持的文件類型 context.xml可以用來配置數(shù)據(jù)源之類的 tomcat-users.xml用來配置管理tomcat的用戶與權(quán)限 在Catalina目錄下可以設置默認加載的項目3、lib目錄主要用來存放tomcat運行需要加載的jar包。4、logs目錄用來存放tomcat在運行過程中產(chǎn)生的日志文件,非常重要的是在控制臺輸出的日志。(清空不會對tomcat運行帶來影響)5、temp目錄用戶存放tomcat在運行過程中產(chǎn)生的臨時文件。(清空不會對tomcat運行帶來影響)。6、webapps目錄用來存放應用程序,當tomcat啟動時會去加載webapps目錄下的應用程序。可以以文件夾、war包、jar包的形式發(fā)布應用。7、work目錄用來存放tomcat在運行時的編譯后文件,例如JSP編譯后的.java和.class文件。一個客戶端訪問后編譯后的文件存放在這,下一個客戶端再次訪問可以直接返回,不用再次編譯程序。清空work目錄,然后重啟tomcat,可以達到清除緩存的作用。如果項目下包含文件卻一直報找不到的異常,可以清空該文件夾下的內(nèi)容,然后重新編譯,便可以得到解決。





注:本篇文章內(nèi)容大量借鑒拉勾教育Java高薪訓練營的課程內(nèi)容,由此表示衷心的感謝!

關鍵詞:中間

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關閉