版本:
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
:全局配置,很熟悉,我們java web工程也有自己的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.1 Tomcat請求的大致流程
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.2 Servlet容器處理請求流程
當⽤戶請求某個URL資源時
- HTTP服務器會把請求信息封裝成Request對象,然后轉換為ServletRequest對象
- 進⼀步去調⽤Servlet容器中某個具體的Servlet
- 在 2中,Servlet容器拿到請求后,根據URL和Servlet的映射關系,找到相應的Servlet
- 如果Servlet還沒有被加載,就⽤反射機制創建這個Servlet,並調⽤Servlet的init⽅法來完成初始化(反射)
- 接着調⽤這個具體Servlet的service⽅法來處理請求,請求處理結果使⽤ServletResponse對象封裝
- 把ServletResponse對象返回給HTTP服務器,HTTP服務器會把響應發送給客戶端
3.3 Tomcat系統總體架構
從上可以看出,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(傳輸層)相關內容
Tomcat Coyote支持的IO模型與協議:
應用層默認協議:HTTP/1.1
傳輸層默認IO模型:NIO
在 8.0 之前 ,Tomcat 默認采⽤的I/O⽅式為 BIO(同步阻塞IO),之后改為 NIO。 無論 NIO、NIO2 還是 APR, 在性能⽅⾯均優於以往的BIO。 如果采⽤APR, 甚⾄可以達到 Apache HTTP Server 的影響性能。
4.2 Coyote內部組件以及流程
組件 | 作用描述 |
---|---|
EndPoint | EndPoint 是 Coyote 通信端點,即通信監聽的接⼝,是具體Socket接收和發送處理器,是對傳輸層的抽象,因此EndPoint⽤來實現TCP/IP協議的 |
Processor | Processor 是Coyote 協議處理接⼝ ,如果說EndPoint是⽤來實現TCP/IP協議的,那么Processor⽤來實現HTTP協議,Processor接收來⾃EndPoint的 Socket,讀取字節流解析成Tomcat Request和Response對象,並通過 Adapter將其提交到容器處理,Processor是對應⽤層協議的抽象 |
ProtocolHandler | Coyote 協議接⼝, 通過Endpoint 和 Processor , 實現針對具體協議的處 理能⼒。Tomcat 按照協議和I/O 提供了6個實現類 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol |
Adapter | 由於協議不同,客戶端發過來的請求信息也不盡相同,Tomcat定義了⾃⼰的 Request類來封裝這些請求信息。ProtocolHandler接⼝負責解析請求並⽣成 Tomcat Request類。但是這個Request對象不是標准的ServletRequest,不能⽤Tomcat Request作為參數來調⽤容器。Tomcat設計者的解決⽅案是引⼊CoyoteAdapter,這是適配器模式的經典運⽤,連接器調⽤ CoyoteAdapter的Sevice⽅法,傳⼊的是Tomcat Request對象, CoyoteAdapter負責將Tomcat Request轉成ServletRequest,再調⽤容器 |
五,Tomcat Servlet 容器 Catalina
5.1 Tomcat模塊分層結構圖及Catalina位置
Tomcat是⼀個由⼀系列可配置(conf/server.xml)的組件構成的Web容器,⽽Catalina是Tomcat的servlet容器。
Tomcat本質上就是⼀款Servlet容器, 因為Catalina才是Tomcat的核⼼ , 其他模塊都是為Catalina 提供⽀撐的。 ⽐如 :
- 通過 Coyote 模塊提供鏈接通信
- Jasper 模塊提供 JSP 引擎
- Naming 提供JNDI 服務
- Juli 提供⽇志服務。
模塊分層結構圖:
5.2 Servlet容器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
服務器表示整個Catalina Servlet容器以及其它組件,負責組裝並啟動Servlet引擎、Tomcat連接器。Server通過實現Lifecycle
接⼝,提供了⼀種優雅的啟動和關閉整個系統的⽅式 - Service
服務是Server內部的組件,⼀個Server包含多個Service。它將若⼲個Connector組件綁定到⼀個 Container - Container
容器,負責處理⽤戶的servlet請求,並返回對象給web⽤戶的模塊
5.2 Container組件的具體結構
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中。