成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入分析 Tomcat 原理

開發 架構
隨著互聯網發展,往往更多的是需要動態的交互。所以 Sun 公司推出了 Servlet 技術:servlet 規范!目前最新是 Servlet 4.0 ,它支持 HTTP2.0!

早期Web容器早期的 Web 應用主要用于瀏覽新聞等靜態頁面,HTTP 服務器(比如 Apache、Nginx)向瀏覽器返回靜態 HTML,瀏覽器負責解析 HTML,將結果呈現給用戶。

Servlet規范

隨著互聯網發展,往往更多的是需要動態的交互。所以 Sun 公司推出了 Servlet 技術:servlet 規范!目前最新是 Servlet 4.0 ,它支持 HTTP2.0!

符合 Servlet 規范的 Web 流程:由 Servlet 容器來創建和管理 Servlet,客戶端的請求 會被封裝成 ServletRequest 和 ServletResponse,其本質上就是對通信協議的封裝。

Tomcat簡介

Tomcat 就是一個 Servlet 容器,實現了對 Servlet 和 JavaServer Page(JSP)的支持。同時,它還具有 HTTP 服務器的功能。所以,「Tomcat = HTTP服務器 + Servlet容器」,一般我們給這種組件稱為:「輕量級web容器」!

Tomcat架構

Tomcat-Server

  • 「Server」:一個 Server 就是一個 Tomcat 實例,下載 Tomcat 壓縮包,執行 /bin/startup.sh,就可以啟動一個 Tomcat 實例。
  • 「Service」:一個對外服務的整體,它包括多個 Connector 和一個 Engine。同時,一個 Server 可以配置多個 Service。實際上 Service 只是將組件組合到一起,本身并沒有實現什么功能。

Tomcat-連接器

連接器,啟動 ServerSocket,負責監聽 Socket 請求,將數據轉換成 Tomcat Request,交給 Engine 處理。一個 Service 可以有多個 Connector,表示它可以監聽多個端口。

Tomcat-容器

即 Servlet 容器,它是 Tomcat 容器的最頂層組件,它會管理多個虛擬主機 Host,一個 Service 只能有一個 Engine,但是一個 Engine 可以配置多個 Host。Tomcat 的 Servlet 容器是具有明顯的分層架構的。

  • 「Host」:虛擬主機,默認為 localhost,也就是 127.0.0.1。也可以配置不同的 IP 地址,訪問不同的 IP 地址就可以訪問到不同的虛擬主機。一個 Host 可以部署多個 Context。
  • 「Context」:應用程序,一般會把我們實現的 Servlet 應用打包成 war,放到 Tomcat 的 webapps 目錄下,Tomcat 會將其解壓并部署映射成一個 Context 組件,表示一個應用上下文。一個 Context 可以管理多個 Wrapper,畢竟一個 web 應用肯定有多個 Servlet。
  • 「Wrapper」:這個組件 Tomcat 配置文件并沒有,因為它是在 web.xml 配置,它就是 Servlet。確切地說,是 Tomcat 用 Wrapper 包裹了我們自己實現的 Servlet。一個請求最終就會到 Wrapper 來執行。

Tomcat生命周期管理

「Tomcat 設計眾多組件來保證高內聚低耦合,保證可擴展性」。但是,組件數量多也會帶來其它問題,比如組件的管理,在啟動、關閉和銷毀需要涉及多個組件的操作。Tomcat 設計了 LifeCycle 接口,它定義生命周期鉤子函數:init()、start()、stop() 和 destroy(),組件都實現這個接口,定義自己的處理邏輯。并且,上層組件在觸發自己生命周期鉤子函數的同時,會觸發它管理的下層組件的鉤子函數。其實國外設計框架很喜歡設計這個 LifeCycle 接口,新版 Apache Dubbo 也加入了這一特性。

Tomcat 在實現組件生命周期管理,充分利用了「組合模式、觀察者模式和模板模式」。

  • 「組合模式」:Tomcat 通過組合模式,用上層組件來管理它下一級組件,每個組件都是這樣的管理方式。這樣暴露給用戶的是,只需要對一個組件進行訪問,則可以達到一個完整系統調用的一致性效果。以 Tomcat 最頂級的組件 Server 來看,它的 init() 方法:
  • 「觀察者模式」:Tomcat 考慮自身的可擴展性,避免版本升級就得修改生命周期鉤子函數,它引入了監聽器 LifecycleListener 和 LifecycleState。它設計了一套貫穿組件生命周期全過程的狀態集合,例如:當組件剛創建則處于 NEW 狀態,調用了 init() 方法處于 INITIALIZED 狀態...在調用生命周期方法的前后,會改變組件的狀態,而狀態的改變會被封裝成為一個個事件 LifecycleEvent,由監聽器來處理這些事件。
  • 「模板模式」:主要體現了代碼實現上,實際上狀態的轉變、事件的創建以及監聽器的回調,這些操作其實沒有必要在每個組件中自己實現,這會造成重復代碼。Tomcat 在實現這個功能的時候,把這些通用邏輯抽象了出來,定義為一個 LifecycleBase 抽象類,它會定義骨架方法,比如 init() 方法。

Tomcat連接器

Tomcat 連接器,用來監聽 Socket 連接,將 TCP 底層的字節流數據,轉換為 Request 和 Response;連接器主要有3個組件:「EndPoint、Processor、Adapter」。

  • ?「Endpoint」 負責提供字節流給 Processor。
  • 「Processor」 負責提供 Tomcat Request 對象給 Adapter。
  • 「Adapter」 負責轉換 ServletRequest 對象給容器。

其中,Tomcat 將 EndPoint 和 Processor 組合到一起,組成了 ProtocolHandler,這其實就是一種組合設計模式的使用。

Tomcat連接器-NioEndpoint

「Tomcat 使用 NioEndPoint 基于 java 的 nio 包實現了 I/O 多路復用模型」,主要包含了 LimitLatch、Acceptor、Poller、SocketProcessor 和 Executor 共 5 個組件。它的工作過程如下:

  1. 「LimitLatch」:負責控制最大連接數,NIO 模式下默認是 10000,達到這個閾值后,連接請求被拒絕。它是基于 AQS 實現,原理就跟 Lock 一樣。
  2. 「Acceptor」:獨立線程,不斷調用 ServerSocketChannel 的 accept() 方法來接收新連接,一旦有新的連接請求到來,返回 SocketChannel 對象,然后將其封裝在一個 PollerEvent 對象中,并將 PollerEvent 對象壓入 Poller 的 Queue 里(「典型的生產者 - 消費者模式」)。
  3. 「Poller」:獨立運行在一個線程里,底層就是一個 Selector,每個 Poller 線程可能同時被多個 Acceptor 線程調用來注冊 PollerEvent。Poller 不斷的通過內部的 Selector 對象向內核查詢 Channel 的狀態,一旦可讀就生成任務類 SocketProcessor 交給 Executor 去處理。
  4. 「SocketProcessor」:實現了 Runable 接口,主要是調用 Http11Processor 來處理請求。Tomcat 會將 Socket 包裝成一個 SocketWrapper,Http11Processor 會調用 SocketWrapper 來讀寫數據。
  5. 「Executor」:自定義的線程池,負責運行 SocketProcessor ,會調用 Http11Processor 來讀取和解析請求數據。Http11Processor 是應用層協議的封裝,它會調用容器獲得響應,再把響應通過 Channel 寫出。

Tomcat連接器-Nio2Endpoint

Tomcat 還支持了異步 I/O,基于 Java AIO 實現 - Nio2Endpoint 的組件跟 NioEndpoint 類似,但是 Nio2Endpoint 中沒有 Poller 組件,也就是沒有 Selector。這是因為在異步 I/O 模式下,Selector 的工作交給內核來做了。

  • LimitLatch」:跟 NioEndPoint 一樣,連接控制器,它負責控制最大連接數。
  • 「Nio2Acceptor」:擴展了 Acceptor,自己就是處理連接的回調類,用異步 I/O 的方式來接收新連接后,得到一個 AsynchronousSocketChannel,它會將其封裝成一個 Nio2SocketWrapper,并創建一個SocketProcessor 任務類交給線程池處理。
  • 「Nio2SocketWrapper」:實際讀取 Channel 內的數據,并提供接口給 Http11Processor 讀寫。但是由于異步 I/O 的性質,Http11Processor 讀取 Nio2SocketWrapper 時很有可能內核還沒有將數據準備好,為了解決這個問題,Http11Processor 采用了2次 read 調用:通過注冊回調類 readCompletionHandler。

最后

其實 Tomcat 的實現細節很多,沒辦法一一重現,大部分情況下需要自己去對著源碼跑一遍,像很多實際運用:

  • ContainerBackgroundProcessor,實現熱更新機制:熱加載和熱部署。
  • 對象池技術,典型的以空間換時間的思路,通過 SynchronizedStack 減少 SocketWrapper 和SocketProcessor 的創建和銷毀。
  • Servlet 3.0 中引入的異步 Servlet,Tomcat 對其做了支持,它的思想是:讓業務線程和 Tomcat I/O 線程分離開,將復雜耗時的業務計算移到業務線程池中進行,釋放 Tomcat的I/O 線程,以便可以及時響應其它請求。
  • 會話管理...
  • 集群管理...
責任編輯:姜華 來源: Java架構師進階編程
相關推薦

2009-11-13 13:08:19

2011-03-23 11:01:55

LAMP 架構

2010-09-07 14:21:22

PPPoE協議

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態化OSGi動態化

2022-08-30 07:00:18

執行引擎Hotspot虛擬機

2009-12-14 14:50:46

Ruby傳參數

2021-10-29 16:36:53

AMSAndroidActivityMan

2023-02-01 08:13:30

Redis內存碎片

2011-09-01 13:51:52

JavaScript

2010-03-08 14:53:48

Linux分區

2009-12-22 15:39:36

IPPBX技術

2017-02-27 10:43:07

Javasynchronize

2022-03-17 10:24:28

JavaJVM

2009-07-03 11:14:57

2011-06-28 14:11:33

JavaScript

2014-10-30 15:08:21

快速排序編程算法

2009-04-13 16:37:33

JSPWeb標簽

2015-08-03 09:54:26

Java線程Java

2018-10-25 15:24:10

ThreadLocal內存泄漏Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区免费 | 狠狠操电影 | 午夜影视在线观看 | 亚洲一区三区在线观看 | 欧美美女二区 | 中文字幕亚洲一区二区三区 | 成人亚洲视频 | 99日韩| www.伊人.com| 992人人草| 蜜桃视频成人 | 欧美一级特黄aaa大片在线观看 | 日韩欧美精品一区 | 成人欧美一区二区三区在线播放 | 久久国产精品视频免费看 | 欧美日韩国产高清 | 国产美女精品视频 | 欧美日韩视频在线 | 日本久久黄色 | 国产欧美精品一区二区 | 亚洲最色视频 | 精品久久久久久久人人人人传媒 | 亚洲网址 | 国产激情视频网 | 中文字幕一区在线观看视频 | 久久久91精品国产一区二区三区 | 午夜av免费| 91精品国产乱码久久久久久久 | 无码国模国产在线观看 | 男人天堂网站 | 国产免费一区二区 | 91精品国产综合久久久动漫日韩 | 国产一级淫片免费视频 | 爱爱视频日本 | 99成人 | 亚洲黄色一区二区三区 | 这里只有精品99re | 日韩免费网站 | 性xxxxx | 免费在线观看一级毛片 | 精品国产精品国产偷麻豆 |