Tomcat想必大家都不陌生,接觸得最多的就是他了,但是對于他的認知,很多人估計都是停留在把項目打成war包,扔在webapp目錄下面,然后啟動完事,本篇文章基于拉勾的Tomcat課程所做" />

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

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > Tomcat相關(guān)知識總結(jié)(僅僅會打包發(fā)布可不夠)

Tomcat相關(guān)知識總結(jié)(僅僅會打包發(fā)布可不夠)

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

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

Tomcat相關(guān)知識總結(jié)(僅僅會打包發(fā)布可不夠):前言

Tomcat想必大家都不陌生,接觸得最多的就是他了,但是對于他的認知,很多人估計都是停留在把項目打成war包,扔在webapp目錄下面,然后啟動完事,本篇文章基于拉勾的Tomcat課程所做的個人筆記,從外到內(nèi)真正認識一下Tomcat,內(nèi)容包含訪問流程、總體架構(gòu)、兩大組件解析、核心配置標簽解析、啟動流程、請求流程、Tomcat調(diào)優(yōu)等等,希望對大家有所幫助。

一、 Tomcat系統(tǒng)架構(gòu)和原理剖析

瀏覽器訪問服務(wù)器的流程




瀏覽器訪問服務(wù)器使?的是Http協(xié)議,Http是應(yīng)?層協(xié)議,?于定義數(shù)據(jù)通信的格式,具體的數(shù)據(jù)傳輸使?的是TCP/IP協(xié)議。

Tomcat 系統(tǒng)總體架構(gòu)

Tomcat的兩個身份:

1)http服務(wù)器

2)Tomcat是?個Servlet容器

Tomcat是?個Http服務(wù)器,HTTP 服務(wù)器接收到請求之后把請求交給Servlet容器來處理,Servlet 容器通過Servlet接?調(diào)?業(yè)務(wù)類,避免tomcat和業(yè)務(wù)類耦合在一起。Servlet接?和Servlet容器這?整套內(nèi)容就是Servlet規(guī)范。

Tomcat Servlet容器處理流程:

1)HTTP服務(wù)器會把請求信息使?ServletRequest對象封裝起來

2)進?步去調(diào)?Servlet容器中某個具體的Servlet

3)Servlet容器拿到請求后,根據(jù)URL和Servlet的映射關(guān)系,找到相應(yīng)的Servlet

4)如果Servlet還沒有被加載,就?反射機制創(chuàng)建這個Servlet,并調(diào)?Servlet的init?法來完成初始化

5)接著調(diào)?這個具體Servlet的service?法來處理請求,請求處理結(jié)果使?ServletResponse對象封裝

6)把ServletResponse對象返回給HTTP服務(wù)器,HTTP服務(wù)器會把響應(yīng)發(fā)送給客戶端

總結(jié):Tomcat主要干兩個事情

1)和客戶端瀏覽器進?交互,進?socket通信,將字節(jié)流和Request/Response等對象進?轉(zhuǎn)換

2)Servlet容器處理業(yè)務(wù)邏輯




Tomcat設(shè)計了兩個核心組件:連接器(Connector)和容器(Container)來干上面的兩個事情

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

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

Tomcat 兩大組件之連接器組件 Coyote

客戶端通過Coyote與服務(wù)器建?連接、發(fā)送請求并接受響應(yīng):

(1)Coyote 封裝了底層的?絡(luò)通信(Socket 請求及響應(yīng)處理)

(2)Coyote 使Catalina 容器(Container容器組件)與具體的請求協(xié)議及IO操作?式完全解 耦

(3)Coyote 將Socket 輸?轉(zhuǎn)換封裝為 Request 對象,進?步封裝后交由Catalina 容器進?處理,處理請求完成后, Catalina 通過Coyote 提供的Response 對象將結(jié)果寫?輸出流。

(4)Coyote 負責的是具體協(xié)議(應(yīng)?層)和IO(傳輸層)相關(guān)內(nèi)容







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

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




Tomcat 兩大組件之Servlet容器組件Catalina

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

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




整個Tomcat就是?個Catalina實例,一個Catalina實例有一個Server實例,一個Server實例可以有多個Service實例, 每?個Service實例下可以有多個Connector實例和?個Container實例。




Catalina

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

Server

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

Service

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

Container

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

Container組件下有四種具體的組件,分別是Engine、Host、Context和Wrapper,他們是層級關(guān)系。

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

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

Context:表示?個Web應(yīng)?程序, ?個Web應(yīng)?可包含多個Wrapper。

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

Tomcat 服務(wù)器核?配置Server標簽




Tomcat 服務(wù)器核?配置Service標簽




Tomcat 服務(wù)器核?配置Executor標簽




Tomcat 服務(wù)器核?配置Connector標簽

Connector 標簽?于創(chuàng)建鏈接器實例默認情況下,server.xml 配置了兩個鏈接器,?個?持HTTP協(xié)議,?個?持AJP協(xié)議

?多數(shù)情況下,我們并不需要新增鏈接器配置,只是根據(jù)需要對已有鏈接器進?優(yōu)化.




共享線程池:配置共享線程池,多個connector共用,節(jié)約資源。




Tomcat 服務(wù)器核?配置Engine標簽

Engine 表示 Servlet 引擎




Tomcat 服務(wù)器核?配置Host標簽




Tomcat 服務(wù)器核?配置Context標簽




二、手寫實現(xiàn)Tomcat服務(wù)器與源碼剖析

手寫實現(xiàn)Tomcat服務(wù)器需求及實現(xiàn)步驟

1)提供服務(wù),接收請求(Socket通信)

2)請求信息封裝成Request對象(Response對象)

3)客戶端請求資源,資源分為靜態(tài)資源(html)和動態(tài)資源(Servlet)

4)資源返回給客戶端瀏覽器

1. 創(chuàng)建一個啟動類Bootstrap,通過main方法調(diào)用啟動start方法







2. 通過dom4j加載解析web.xml存入map集合中,此map存儲的是地址和自定義的HttpServlet類




3. 定義端口號,創(chuàng)建一個ServerSocket,通過accept獲取Socket類,把Socket和map集合傳入多線程處理類。




4. 通過Socket獲取輸入流封裝Request對象




5. 通過Socket獲取輸出流封裝Response對象。

6. 根據(jù)請求查詢map集合是否為空判斷靜態(tài)資源,靜態(tài)資源處理

7. 動態(tài)資源處理,調(diào)用自定義的LgServlet繼承HttpServlet重寫doGet和doPost進行輸出

8. 關(guān)閉socket,獲取已經(jīng)創(chuàng)建好的多線程類,放入調(diào)用定義線程池threadPoolExecutor中調(diào)用execute執(zhí)行。




Tomcat啟動流程

從腳本start.sh找到Bootstap類的main方法從父容器開始把組件一個個初始化再逐級啟動




Tomcat請求流程

請求處理流程分析圖




Mapper組件體系結(jié)構(gòu)




請求處理流程示意圖




三、Tomcat類加載機制剖析

類加載過程:Java類(.java)文件被編譯成字節(jié)碼文件(.class),然后通過類加載器(classloader)加載到j(luò)vm內(nèi)存中。

JVM類加載機制

Jvm內(nèi)置了?種類加載器,包括:引導類加載器、擴展類加載器、系統(tǒng)類加載器,他們之間形成??關(guān)系,通過 Parent 屬性來定義這種關(guān)系,最終可以形成樹形結(jié)構(gòu),同時我們自己也可以自定義類加載器。







?戶可以?定義類加載器(Java編寫,?戶?定義的類加載器,可加載指定路徑的 class ?件)當 JVM 運?過程中,?戶?定義了類加載器去加載某些類時,會按照下?的步驟(?類委托機制)

1) ?戶??的類加載器,把加載請求傳給?加載器,?加載器再傳給其?加載器,?直到加載器樹的頂層

2 )最頂層的類加載器?先針對其特定的位置加載,如果加載不到就轉(zhuǎn)交給?類

3 )如果?直到底層的類加載都沒有加載到,那么就會拋出異常 ClassNotFoundException

因此,按照這個過程可以想到,如果同樣在 classpath 指定的?錄中和???作?錄中存放相同的class,會優(yōu)先加載 classpath ?錄中的?件。

JVM雙親委派機制

當某個類加載器需要加載某個.class?件時,它?先把這個任務(wù)委托給他的上級類加載器,遞歸這個操作,如果上級的類加載器沒有加載,??才會去加載這個類。

作用:

防?重復加載同?個.class。通過委托去向上?問?問,加載過了,就不?再加載?遍。保證數(shù)據(jù)安全。

保證核?.class不能被篡改。通過委托?式,不會去篡改核?.class,即使篡改也不會去加載,即使加載也不會是同?個.class對象了。不同的加載器加載同?個.class也不是同?個.class對象。這樣保證了class執(zhí)?安全(如果?類加載器先加載,那么我們可以寫?些與java.lang包中基礎(chǔ)類同名的類, 然后再定義?個?類加載器,這樣整個應(yīng)?使?的基礎(chǔ)類就都變成我們??定義的類了)。

Tomcat類加載機制

Tomcat 的類加載機制相對于 Jvm 的類加載機制做了?些改變因為如果同時存在兩個應(yīng)用,然后他們有相同的全限定類名,如果遵循雙親委派機制,tomcat加載了應(yīng)用1的全限定類之后就不會再加載應(yīng)用2的類,但是這兩個類雖然全限定類名相同,里面的邏輯卻是不同的,所以JVM的雙親委派機制就不適合Tomcat了。因此在原來Jvm類加載機制上做了擴展和改變。增加了Commons、Catalina、Shared、WebApp類加載器。







引導類加載器 和 擴展類加載器 的作?不變。

系統(tǒng)類加載器正常情況下加載的是 CLASSPATH 下的類,但是 Tomcat 的啟動腳本并未使?該變量,?是加載tomcat啟動的類,?如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定,位于CATALINA_HOME/bin下。

Common 通?類加載器加載Tomcat使?以及應(yīng)?通?的類,位于CATALINA_HOME/lib下,?如servlet-api.jar。

Catalina ClassLoader ?于加載服務(wù)器內(nèi)部可?類,這些類應(yīng)?程序不能訪問。

Shared ClassLoader ?于加載應(yīng)?程序共享類,這些類服務(wù)器不會依賴。

Webapp ClassLoader,每個應(yīng)?程序都會有?個獨???的Webapp ClassLoader,他?來加載本應(yīng)?程序 /WEB-INF/classes 和 /WEB-INF/lib 下的類。

加載順序:

?先從 Bootstrap Classloader加載指定的類->

如果未加載到,則從 /WEB-INF/classes加載->

如果未加載到,則從 /WEB-INF/lib/*.jar 加載->

如果未加載到,則依次從 System、Common、Shared 加載(在這最后?步,遵從雙親委派機制)

四、Tomcat 對 Https 的支持及 Tomcat 性能優(yōu)化策略

Tomcat 對 HTTPS 的支持

Https是?來加強數(shù)據(jù)傳輸安全的。Http超?本傳輸協(xié)議,明?傳輸 ,傳輸不安全,https在傳輸數(shù)據(jù)的時候會對數(shù)據(jù)進?加密,也就是在http的基礎(chǔ)上增加了ssl協(xié)議。

HTTPS和HTTP的主要區(qū)別:

HTTPS協(xié)議使?時需要到電?商務(wù)認證授權(quán)機構(gòu)(CA)申請SSL證書。

HTTP默認使?8080端?,HTTPS默認使?8443端?。

HTTPS則是具有SSL加密的安全性傳輸協(xié)議,對數(shù)據(jù)的傳輸進?加密,效果上相當于HTTP的升級版。

HTTP的連接是?狀態(tài)的,不安全的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進?加密傳輸、身份認證的?絡(luò)協(xié)議,?HTTP協(xié)議安全。

HTTPS?作原理:




使用:生成秘鑰庫文件xx.keystore,把絕對路徑地址配置到conf/server.xml即可。

JVM內(nèi)存調(diào)優(yōu)

系統(tǒng)性能的衡量指標,主要是響應(yīng)時間和吞吐量。

1)響應(yīng)時間:執(zhí)行某個操作的耗時;

2) 吞吐量:系統(tǒng)在給定時間內(nèi)能夠?持的事務(wù)數(shù)量,單位為TPS(Transactions PerSecond的縮寫,也就是事務(wù)數(shù)/秒,?個事務(wù)是指?個客戶機向服務(wù)器發(fā)送請求然后服務(wù)器做出反應(yīng)的過程。

Java 虛擬機的運?優(yōu)化主要是內(nèi)存分配和垃圾回收策略的優(yōu)化

1)內(nèi)存直接影響服務(wù)的運?效率和吞吐量

2)垃圾回收機制會不同程度地導致程序運?中斷(垃圾回收策略不同,垃圾回收次數(shù)和回收效率都是不同的)




JVM內(nèi)存模型




使用:配置在catalina.sh的腳本




JVM垃圾收集策略

垃圾回收性能指標

吞吐量:?作時間(排除GC時間)占總時間的百分?, ?作時間并不僅是程序運?的時間,還包含內(nèi)存分配時間。

暫停時間:由垃圾回收導致的應(yīng)?程序停?響應(yīng)次數(shù)/時間。

垃圾收集器:

串?收集器(Serial Collector)

單線程執(zhí)?所有的垃圾回收?作, 適?于單核CPU服務(wù)器?作進程-----|(單線程)垃圾回收線程進?垃圾收集|---?作進程繼續(xù)

并?收集器(Parallel Collector)

?作進程-----|(多線程)垃圾回收線程進?垃圾收集|---?作進程繼續(xù)?稱為吞吐量收集器(關(guān)注吞吐量), 以并?的?式執(zhí)?年輕代的垃圾回收, 該?式可以顯著降低垃圾回收的開銷(指多條垃圾收集線程并??作,但此時?戶線程仍然處于等待狀態(tài))。適?于多處理器或多線程硬件上運?的數(shù)據(jù)量較?的應(yīng)?

并發(fā)收集器(Concurrent Collector)

以并發(fā)的?式執(zhí)??部分垃圾回收?作,以縮短垃圾回收的暫停時間。適?于那些響應(yīng)時間優(yōu)先于吞吐量的應(yīng)?, 因為該收集器雖然最?化了暫停時間(指?戶線程與垃圾收集線程同時執(zhí)?,但不?定是并?的,可能會交替進?), 但是會降低應(yīng)?程序的性能

CMS收集器(Concurrent Mark Sweep Collector)

并發(fā)標記清除收集器, 適?于那些更愿意縮短垃圾回收暫停時間并且負擔的起與垃圾回收共享處理器資源的應(yīng)?

G1收集器(Garbage-First Garbage Collector)

適?于?容量內(nèi)存的多核服務(wù)器, 可以在滿?垃圾回收暫停時間?標的同時, 以最?可能性實現(xiàn)?吞吐量(JDK1.7之后)

垃圾回收器參數(shù):




使用:配置在catalina.sh的腳本




Tomcat調(diào)優(yōu)

Tomcat優(yōu)化從兩個??進?

1)JVM虛擬機優(yōu)化(優(yōu)化內(nèi)存模型)

2)Tomcat?身配置的優(yōu)化(?如是否使?了共享線程池?IO模型?)

優(yōu)化一調(diào)整線程池




優(yōu)化二調(diào)整tomcat的連接器:調(diào)整tomcat/conf/server.xml 中關(guān)于鏈接器的配置可以提升應(yīng)?服務(wù)器的性能。




優(yōu)化三禁用 AJP 連接器




優(yōu)化四調(diào)整 IO 模式

Tomcat8之前的版本默認使?BIO(阻塞式IO),對于每?個請求都要創(chuàng)建?個線程來處理,不適合?并發(fā);Tomcat8以后的版本默認使?NIO模式(?阻塞式IO)




當Tomcat并發(fā)性能有較?要求或者出現(xiàn)瓶頸時,我們可以嘗試使?APR模式,APR(Apache PortableRuntime)是從操作系統(tǒng)級別解決異步IO問題,使?時需要在操作系統(tǒng)上安裝APR和Native(因為APR原理是使?使?JNI技術(shù)調(diào)?操作系統(tǒng)底層的IO接?)

優(yōu)化五動靜分離

可以使?Nginx+Tomcat相結(jié)合的部署?案,Nginx負責靜態(tài)資源訪問,Tomcat負責Jsp等動態(tài)資源訪問處理(因為Tomcat不擅?處理靜態(tài)資源)。

關(guān)鍵詞:發(fā)布,打包,相關(guān),知識,總結(jié)

74
73
25
news

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

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