Tomcat學習筆記
時間:2023-07-15 07:51:01 | 來源:網(wǎng)站運營
時間:2023-07-15 07:51:01 來源:網(wǎng)站運營
Tomcat學習筆記:
第?部分:Tomcat 系統(tǒng)架構與原理剖析
1.1 瀏覽器訪問服務器的流程
1.2 Tomcat 系統(tǒng)總體架構
HTTP 服務器接收到請求之后把請求交給Servlet容器來處理, Servlet 容器通過Servlet接?調?業(yè)務 類。 Servlet接?和Servlet容器這?整套內容叫作Servlet規(guī)范。
Tomcat的兩個重要身份 1) http服務器 2) Tomcat是?個Servlet容器
1.2.1 Tomcat Servlet容器處理流程
當?戶請求某個URL資源時 1) HTTP服務器會把請求信息使?ServletRequest對象封裝起來 2)進?步去調?Servlet容器中某個具體的Servlet 3)在 2)中, Servlet容器拿到請求后,根據(jù)URL和Servlet的映射關系,找到相應的Servlet 4)如果Servlet還沒有被加載,就?反射機制創(chuàng)建這個Servlet,并調?Servlet的init?法來完成初始化 5)接著調?這個具體Servlet的service?法來處理請求,請求處理結果使?ServletResponse對象封裝 6)把ServletResponse對象返回給HTTP服務器, HTTP服務器會把響應發(fā)送給客戶端
我們發(fā)現(xiàn)tomcat有兩個?常重要的功能需要完成 1)和客戶端瀏覽器進?交互,進?socket通信,將字節(jié)流和Request/Response等對象進?轉換 2) Servlet容器處理業(yè)務邏輯
Tomcat 設計了兩個核?組件
連接器(Connector) 和
容器(Container) 來完成 Tomcat 的兩?核? 功能。
連接器:負責對外交流: 處理Socket連接,負責?絡字節(jié)流與Request和Response對象的轉化;
容器:負責內部處理: 加載和管理Servlet,以及具體處理Request請求;
1.2.2 連接器組件 Coyote
客戶端通過Coyote與服務器建?連接、發(fā)送請求并接受響應。
(1) Coyote 封裝了底層的?絡通信(Socket 請求及響應處理) (2) Coyote 使Catalina 容器(容器組件)與具體的請求協(xié)議及IO操作?式完全解耦 (3) Coyote 將Socket 輸?轉換封裝為 Request 對象,進?步封裝后交由Catalina 容器進?處理,處 理請求完成后, Catalina 通過Coyote 提供的Response 對象將結果寫?輸出流 (4) Coyote 負責的是具體協(xié)議(應?層)和IO(傳輸層)相關內容
Coyote內部又包含了很多支撐組件
1.2.3 容器組件Catalina
Tomcat就是?個Catalina的實例,因為Catalina是Tomcat的核?。
- Catalina 負責解析Tomcat的配置?件(server.xml) , 以此來創(chuàng)建服務器Server組件并進?管理
- Server 服務器表示整個Catalina Servlet容器以及其它組件,負責組裝并啟動Servlaet引擎,Tomcat連接 器。 Server通過實現(xiàn)Lifecycle接?,提供了?種優(yōu)雅的啟動和關閉整個系統(tǒng)的?式
- Service 服務是Server內部的組件,?個Server包含多個Service。它將若?個Connector組件綁定到?個 Container
- Container 容器,負責處理?戶的servlet請求,并返回對象給web?戶的模塊
- Engine 表示整個Catalina的Servlet引擎,?來管理多個虛擬站點,?個Service最多只能有?個Engine, 但是?個引擎可包含多個Host
- Host
- 代表?個虛擬主機,或者說?個站點,可以給Tomcat配置多個虛擬主機地址,??個虛擬主機下 可包含多個Context
- Context 表示?個Web應?程序, ?個Web應?可包含多個Wrapper
- Wrapper 表示?個Servlet, Wrapper 作為容器中的最底層,不能包含?容器 上述組件的配置其實就體現(xiàn)在conf/server.xml中。
第二部分:?寫實現(xiàn)迷你版 Tomcat
Minicat要做的事情:作為?個服務器軟件提供服務的,也即我們可以通過瀏覽器客戶端發(fā)送http請求, Minicat可以接收到請求進?處理,處理之后的結果可以返回瀏覽器客戶端。 1)提供服務,接收請求(Socket通信) 2)請求信息封裝成Request對象(Response對象) 3)客戶端請求資源,資源分為靜態(tài)資源(html)和動態(tài)資源(Servlet) 4)資源返回給客戶端瀏覽器
第三部分:核?流程源碼剖析
3.1 Tomcat啟動流程
3.3 Tomcat請求處理流程
請求處理流程分析請求處理流程示意圖根據(jù)url尋找對應的servlet,需要按照Host->Context->Wrapper->Servlet的順序一步一步定位。
而tomcat通過Mapper組件來保存Host、Context、Wrapper之間的關系
第四部分:Tomcat 類加載機制剖析
Tomcat類加載器沒有嚴格的遵從雙親委派機制,也可以說打破了雙親委派機制因為如下情況:
有?個tomcat, webapps下部署了兩個應? app1/lib/a-1.0.jar com.lagou.edu.Abc app2/lib/a-2.0.jar com.lagou.edu.Abc 不同版本中Abc類的內容是不同的,代碼是不?樣的
按照雙親委派機制加載會出現(xiàn)有的應用中需要的類不被加載!
- 引導類加載器 和 擴展類加載器 的作?不變
- 系統(tǒng)類加載器正常情況下加載的是 CLASSPATH 下的類,但是 Tomcat 的啟動腳本并未使?該變 量,?是加載tomcat啟動的類,?如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。 位于CATALINA_HOME/bin下
- Common 通?類加載器加載Tomcat使?以及應?通?的?些類,位于CATALINA_HOME/lib下, ?如servlet-api.jar
- Catalina ClassLoader ?于加載服務器內部可?類,這些類應?程序不能訪問
- Shared ClassLoader ?于加載應?程序共享類,這些類服務器不會依賴
- Webapp ClassLoader,每個應?程序都會有?個獨???的Webapp ClassLoader,他?來加載 本應?程序 /WEB-INF/classes 和 /WEB-INF/lib 下的
1、?先從 Bootstrap Classloader加載指定的類 2、如果未加載到,則從 /WEB-INF/classes加載 3、如果未加載到,則從 /WEB-INF/lib/*.jar 加載
4、如果未加載到,則依次從 System、 Common、 Shared 加載
第五部分:Tomcat 性能優(yōu)化
Tomcat優(yōu)化從兩個??進? 1) JVM虛擬機優(yōu)化(優(yōu)化內存模型) 2) Tomcat?身配置的優(yōu)化(?如是否使?了共享線程池? IO模型?)
5.1 虛擬機運?優(yōu)化(參數(shù)調整)
Java 虛擬機的運?優(yōu)化主要是內存分配和垃圾回收策略的優(yōu)化:
- 內存直接影響服務的運?效率和吞吐量
- 垃圾回收機制會不同程度地導致程序運?中斷(垃圾回收策略不同,垃圾回收次數(shù)和回收效率都是 不同的)
使用
jhsdb map --heap --pid 8481
查看
2) 垃圾回收(GC)策略jvm內存配置
垃圾回收性能指標
- 吞吐量:?作時間(排除GC時間)占總時間的百分?, ?作時間并不僅是程序運?的時間,還包 含內存分配時間。
- 暫停時間:由垃圾回收導致的應?程序停?響應次數(shù)/時間。
上述配置的更改在bin/catalina.sh
的腳本中 , 追加對應的配置重啟tomcat即可。
5.2 Tomcat 配置調優(yōu)
調整tomcat線程池使用共享線程池
調整tomcat的連接器禁? AJP 連接器調整 IO 模型Tomcat8之前的版本默認使?BIO(阻塞式IO),對于每?個請求都要創(chuàng)建?個線程來處理,不適 合?并發(fā); Tomcat8以后的版本默認使?NIO模式(?阻塞式IO)
修改
protocl
屬性為對應的協(xié)議IO模型的全路徑名即可,如
protocol=org.apache.coyote.http11.Http11Nio2Protocol
當Tomcat并發(fā)性能有較?要求或者出現(xiàn)瓶頸時,我們可以嘗試使?APR模式, APR(Apache Portable Runtime)是從操作系統(tǒng)級別解決異步IO問題,使?時需要在操作系統(tǒng)上安裝APR和Native(因為APR 原理是使?使?JNI技術調?操作系統(tǒng)底層的IO接?)。
動靜分離可以使?Nginx+Tomcat相結合的部署?案, Nginx負責靜態(tài)資源訪問, Tomcat負責Jsp等動態(tài)資 源訪問處理(因為Tomcat不擅?處理靜態(tài)資源)。
文章來源:拉勾教育Java高薪訓練營15期