【Tomcat】Tomcat原理與系統架構 - IT人

文章推薦指數: 80 %
投票人數:10人

Tomcat是⼀個由⼀系列可配置(conf/server.xml)的元件構成的Web容器,⽽Catalina是Tomcat的servlet容器。

Tomcat本質上就是⼀款Servlet容器, 因為 ... Togglenavigation IT人 IT人 【Tomcat】Tomcat原理與系統架構 鄧曉暉發表於 2020-12-24 Tomcat 目錄版本:一,目錄說明二,瀏覽器訪問伺服器的流程三,Tomcat系統總體架構3.1Tomcat請求的大致流程3.2Servlet容器處理請求流程3.3Tomcat系統總體架構四,Tomcat聯結器元件Coyote4.1簡介4.2Coyote內部元件以及流程五,TomcatServlet容器Catalina5.1Tomcat模組分層結構圖及Catalina位置5.2Servlet容器Catalina結構5.2Container元件的具體結構 版本: https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.50/ 一,目錄說明 bin/ bin目錄下關注兩個檔案:啟動和停止的指令碼檔案 啟動:startup.bat(win),startup.sh(Linux&Mac) 停止:shutdown.bat(win),shutdown.sh(Linux&Mac) conf/配置檔案存放的目錄 logging.properties:日誌的配置 server.xml:伺服器配置檔案,例如埠的指定 tomcat-users.xml:定義了tomcat的角色以及角色擁有的功能 web.xml:全域性配置,很熟悉,我們javaweb工程也有自己的web.xml,這個是Tomcat級別的,自己的web.xml如果和它重複那麼自己的會覆蓋Tomcat的。

lib/存放jar包 tomcat本身也是基於java開發的,它的執行也依賴於一些基礎的jar包 logs/存放日誌 temp/臨時目錄 webapps/預設釋出專案的目錄 當我們釋出一個專案時,需要把我們專案的jar包(如釋出jar包,它會解壓出來)或者檔案存放在該目錄 work/jsp編譯執行存放過程檔案的目錄 二,瀏覽器訪問伺服器的流程 Http請求的處理過程: http請求只是定義了資料的組織格式(通訊格式),是一個應用層協議,資料傳輸依靠的是TCP/IP協議。

使用者發起請求(url地址、點選、搜尋等)動作被瀏覽器捕獲 瀏覽器傳送TCP連線請求,到伺服器(socket處理) 伺服器接收請求並建立連線(三次握手) 連線上之後,瀏覽器生成Http協議格式(比如說定義請求頭裡放xxxx,請求體裡放xxxxx)的資料包 瀏覽器傳送請求資料包(也是依靠TCP協議) 伺服器解析Http格式的資料包 伺服器執行請求完成業務邏輯 伺服器生成Http協議格式的資料包 伺服器傳送響應資料包(同樣依靠TCP協議) 瀏覽器解析Http格式的資料包 瀏覽器呈現靜態資料給使用者 傳輸的形式: 三,Tomcat系統總體架構 3.1Tomcat請求的大致流程 Tomcat是一個Http伺服器(因為它能夠接收處理Http請求) 我們使⽤瀏覽器向某⼀個⽹站發起請求,發出的是Http請求,那麼在遠端,Http伺服器接收到這個請求之後,會調⽤具體的程式(Java類)進⾏處理,往往不同的請求由不同的Java類完成處理。

大致流程:與上圖不同,增加了Servlet容器解耦 HTTP伺服器接收到請求之後把請求交給Servlet容器來處理,Servlet容器通過Servlet接⼝調⽤業務類。

Servlet接⼝和Servlet容器這⼀整套內容叫作Servlet規範。

注意:Tomcat既按照Servlet規範的要求去實現了Servlet容器,同時它也具有HTTP伺服器的功能。

Tomcat的兩個重要身份 1)http伺服器 2)Tomcat是⼀個Servlet容器 3.2Servlet容器處理請求流程 當⽤戶請求某個URL資源時 HTTP伺服器會把請求資訊封裝成Request物件,然後轉換為ServletRequest物件 進⼀步去調⽤Servlet容器中某個具體的Servlet 在2中,Servlet容器拿到請求後,根據URL和Servlet的對映關係,找到相應的Servlet 如果Servlet還沒有被載入,就⽤反射機制建立這個Servlet,並調⽤Servlet的init⽅法來完成初始化(反射) 接著調⽤這個具體Servlet的service⽅法來處理請求,請求處理結果使⽤ServletResponse物件封裝 把ServletResponse物件返回給HTTP伺服器,HTTP伺服器會把響應傳送給客戶端 3.3Tomcat系統總體架構 從上可以看出,Tomcat兩個重要的功能: 和客戶端瀏覽器進⾏互動,進⾏socket通訊,將位元組流和Request/Response等物件進⾏轉換 Servlet容器處理業務邏輯 Tomcat設計了兩個核⼼元件聯結器(Connector)和容器(Container)來完成Tomcat的兩⼤核⼼功能: 聯結器,負責對外交流:處理Socket連線,負責⽹絡位元組流與Request和Response物件的轉化; 容器,負責內部處理:載入和管理Servlet,以及具體處理Request請求; 四,Tomcat聯結器元件Coyote 4.1簡介 Coyote是Tomcat中聯結器的元件名稱,是對外的接⼝。

客戶端通過Coyote與伺服器建⽴連線、傳送請求並接受響應。

Coyote封裝了底層的⽹絡通訊(Socket請求及響應處理) Coyote使Catalina容器(容器元件的名稱)與具體的請求協議及IO操作⽅式完全解耦 Coyote將Socket輸⼊轉換封裝為Request物件,進⼀步封裝後(再次封裝為ServletRequest)交由Catalina容器進⾏處理,處理請求完成後,Catalina通過Coyote提供的Response物件將結果寫⼊輸出流 Coyote負責的是具體協議(應⽤層)和IO(傳輸層)相關內容 TomcatCoyote支援的IO模型與協議: 應用層預設協議:HTTP/1.1 傳輸層預設IO模型:NIO 在8.0之前,Tomcat預設採⽤的I/O⽅式為BIO(同步阻塞IO),之後改為NIO。

無論NIO、NIO2還是APR,在效能⽅⾯均優於以往的BIO。

如果採⽤APR,甚⾄可以達到ApacheHTTPServer的影響效能。

4.2Coyote內部元件以及流程 元件 作用描述 EndPoint EndPoint是Coyote通訊端點,即通訊監聽的接⼝,是具體Socket接收和傳送處理器,是對傳輸層的抽象,因此EndPoint⽤來實現TCP/IP協議的 Processor Processor是Coyote協議處理接⼝,如果說EndPoint是⽤來實現TCP/IP協議的,那麼Processor⽤來實現HTTP協議,Processor接收來⾃EndPoint的Socket,讀取位元組流解析成TomcatRequest和Response物件,並通過Adapter將其提交到容器處理,Processor是對應⽤層協議的抽象 ProtocolHandler Coyote協議接⼝,通過Endpoint和Processor,實現針對具體協議的處理能⼒。

Tomcat按照協議和I/O提供了6個實現類:AjpNioProtocol,AjpAprProtocol,AjpNio2Protocol,Http11NioProtocol,Http11Nio2Protocol,Http11AprProtocol Adapter 由於協議不同,客戶端發過來的請求資訊也不盡相同,Tomcat定義了⾃⼰的Request類來封裝這些請求資訊。

ProtocolHandler接⼝負責解析請求並⽣成TomcatRequest類。

但是這個Request物件不是標準的ServletRequest,不能⽤TomcatRequest作為引數來調⽤容器。

Tomcat設計者的解決⽅案是引⼊CoyoteAdapter,這是介面卡模式的經典運⽤,聯結器調⽤CoyoteAdapter的Sevice⽅法,傳⼊的是TomcatRequest物件,CoyoteAdapter負責將TomcatRequest轉成ServletRequest,再調⽤容器 五,TomcatServlet容器Catalina 5.1Tomcat模組分層結構圖及Catalina位置 Tomcat是⼀個由⼀系列可配置(conf/server.xml)的元件構成的Web容器,⽽Catalina是Tomcat的servlet容器。

Tomcat本質上就是⼀款Servlet容器,因為Catalina才是Tomcat的核⼼,其他模組都是為Catalina提供⽀撐的。

⽐如: 通過Coyote模組提供連結通訊 Jasper模組提供JSP引擎 Naming提供JNDI服務 Juli提供⽇志服務。

模組分層結構圖: 5.2Servlet容器Catalina結構 也可以這麼說:Tomcat就是一個Catalina的例項,因為Catalina是Tomcat的核心。

Tomcat/Catalina例項: Tomcat啟動的時候會初始化這個例項,Catalina例項通過載入server.xml完成其他例項的建立,建立並管理⼀個Server,Server建立並管理多個服務,每個服務⼜可以有多個Connector和⼀個Container。

⼀個Catalina例項(容器) ⼀個Server例項(容器) 多個Service例項(容器) 對應關係:每⼀個Service例項下可以有多個Connector例項和⼀個Container例項 Catalina 負責解析Tomcat的配置⽂件(server.xml),以此來建立伺服器Server元件並進⾏管理 Server 伺服器表示整個CatalinaServlet容器以及其它元件,負責組裝並啟動Servlet引擎、Tomcat聯結器。

Server通過實現Lifecycle接⼝,提供了⼀種優雅的啟動和關閉整個系統的⽅式 Service 服務是Server內部的元件,⼀個Server包含多個Service。

它將若⼲個Connector元件繫結到⼀個Container Container 容器,負責處理⽤戶的servlet請求,並返回物件給web⽤戶的模組 5.2Container元件的具體結構 Container元件下有⼏種具體的元件,分別是Engine、Host、Context和Wrapper。

這4種元件(容器)是⽗⼦關係。

Tomcat通過⼀種分層的架構,使得Servlet容器具有很好的靈活性。

Engine 表示整個Catalina的Servlet引擎,⽤來管理多個虛擬站點,⼀個Service最多隻能有⼀個Engine,但是⼀個引擎可包含多個Host Host 代表⼀個虛擬主機,或者說⼀個站點,可以給Tomcat配置多個虛擬主機地址,⽽⼀個虛擬主機下可包含多個Context Context 表示⼀個Web應⽤程式,⼀個Web應⽤可包含多個Wrapper Wrapper 表示⼀個Servlet,Wrapper作為容器中的最底層,不能包含⼦容器 上述元件的配置其實就體現在conf/server.xml中。

相關文章 如何選擇合適的建站系統 2020-12-23 餐廳點餐系統GUI——Java大作業 2020-12-23 Java Java學習筆記-Day52JavaWeb、Tomcat、Servlet 2020-12-23 JavaTomcat Base64原理和實現 2020-12-23 淺談,C語言編譯原理的個人見解 2020-12-23 Linux系統快速安裝JDK 2020-12-23 Linux 【控制】《多智慧體機器人系統資訊融合與協調》範波老師-第7章-基於Markov對策的多Agent協調 2020-12-23 設計模式——責任鏈(結合Tomcat中Filter機制) 2020-12-23 設計模式Tomcat CMS管理系統 2020-12-23 linux系統編碼問題:vi不能輸入中文,ssh遠端連線終端不能輸入中文,中文顯示亂碼等 2020-12-23 Linux c語言圖書館管理系統----學會使用結構體 2020-12-23 分散式檔案系統之FastDFS 2020-12-23 梯度下降法原理及小結 2020-12-23 Linux企業實戰(五十六)——分散式檔案系統MFS(一) 2020-12-24 Linux ARM裸機程式設計學習第一課之硬體知識LED原理圖01 2020-12-24 容器編排系統K8s之Volume的基礎使用 2020-12-24 k8s Linux系統程式設計入門 2020-12-24 Linux 有了Windows/MacOS這麼好用的作業系統,我們為什麼需要Linux? 2020-12-24 LinuxmacOS 2020-12-24《重學作業系統——上》林䭽前阿里巴巴高階技術專家(P8) 2020-12-24 Android-NDK-11-C語言編譯原理 2020-12-24 Android 最新文章 Go記憶體架構,一個有趣的問題 CSS神奇的卡片懸停互動效果 HTTPClient學習筆記(一)初遇篇 數倉選型必列入考慮的OLAP列式資料庫ClickHouse(中) 04Springboot格式化LocalDateTime 國際清算銀行:央行數字貨幣系統報告摘要 磁力引擎:2022快手短劇資料價值報告(附下載) Python資料分析--Numpy常用函式介紹(2) JAVA陣列案例! 介面自動化測試是個啥?如何開始?什麼是框架?帶你揭開神祕面紗 Spring原始碼(17)SpringBean的建立過程(8)Bean的初始化 12┃音視訊直播系統之WebRTC實現1對1直播系統實戰



請為這篇文章評分?