您好,登錄后才能下訂單哦!
這篇文章主要講解了“Tomcat架構設計原理是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Tomcat架構設計原理是什么”吧!
2.1.1 server
從最基本的功能來講,可以簡單地將服務器看成一個應用(這里不細分容器服務器、應用服務器等),其只需要能接受客戶端的請求并進行解析,完成相關業務處理,最后將處理結果作為響應返回給客戶端。
通常情況下,我們可通過socket監聽服務器指定端口來實現該功能,按描述可設計如下:
我們通過start()方法啟動服務器,打開socket鏈接,監聽服務器端口,接受客戶端的請求并返回響應。同時提供stop方法()來停止服務器并釋放網絡資源。
如果我們設計的不是一款服務器,僅僅是作為嵌入在應用系統中的一個遠程請求處理方案且QPS要求不高的,這或許是個不錯的方案!但是,我們設計的是應用服務器
2.1.2 connector和container
在實踐中很快就發現將請求和處理放到一起擴展性很差,如對于適配多種網絡協議,但是請求處理邏輯是相同的。因為tomcat始終支持與apache集成,無論是AJP協議還是HTTP協議。例如,當web應用單獨部署到tomcat時采用HTTP協議;當apache進行集群部署時,采用AJP協議進行連接。應用服務器tomcat在兩者架構下切換時,應確保web應用不需做任何變更。
所以,很自然地可以想到將網絡協議與請求處理從概念上進行分離,如下圖:
一個server可以包括多個connector和container。其中connector負責開啟socket并監聽客戶端請求、返回響應數據;container負責具體的請求處理;各自擁有自己的start()和stop()方法來加載和釋放自己維護的資源。
同樣,該設計仍然有缺點,就是如何知曉來自某個connector的請求由哪個container處理呢?更合理的設計應該如下:
或許你們想過可以通過維護一個復雜的映射規則來解決上述問題,但是事實是多次一舉的,因為上述的設計已經足夠靈活!如圖2-3,一個server包含多個service,一個service負責多個connector和一個container,這樣來自container的請求只能由它所屬的service維護的container來處理。多個service是相互獨立的,但共享一個JVM以及系統類庫。
在tomcat規范中更多地把container組件名稱為engine,用以表示整個servlet引擎,但需記住不是servlet容器,server才表示servlet容器。引擎只需要負責請求的處理,不用考慮請求的鏈接、協議、返回等的處理。
2.1.3 container設計
上一節解決了協議與容器的解耦,但是我們設計的是應用服務器,用來部署并運行web應用的,是一個運行環境,而非一個具體的業務處理系統。因此,我們需要在engine容器中支持web管理應用,當收到connector的處理請求時,engine能夠找到一個合適的web應用來處理。
我們使用context來表示一個web應用,并且一個engine可以包含多個context。
此時,設計已經越來越完美了!但此時又有個實際的場景,線上主機承擔著多個域名的服務,我們該如何處理?在該主機上運行多個應用服務器實例?可以!但如果只運行一個實例呢?
我們可以將每個域名視為一個虛擬的主機,在每個虛擬的主機包含多個web應用,客戶端用戶來說是不關心這些的,所以如下圖:
一個host主機可包含多個context應用。
通過閱讀servlet規范可知,在一個web應用中是通過包含多個servlet實例以處理不同的請求鏈接,所以還需要一個組件,該組件在tomcat被稱為wrapper,所以修改后的設計如下圖:
截止目前,我們多次提到“容器”這個概念,有時指engine,有時指context,但實際他代表著一類組件,這類組件的作用就是接受請求并返回響應數據。盡管具體操作可能委托給子組件完成,但從行為定義上是一致的。基于這個概念,我們可以再次修改設計圖,如下:
我們使用container來表示容器,其可添加并維護子容器,因此engine、host、context、wrapper均繼承container。service是組合著engine(在tomcat8.5.6之前是組合container)。
請記住,框架設計是否需要如此復雜是根據需求來看,如只需要嵌入式啟動tomcat、不必支持多web應用,那么完全可以只在service中維護一個簡化版的engine即可。
補充:
tomcat的container還有一個很重要的功能,就是后臺處理,用于實現定期異步處理,如對文件變更掃描等,實現原理是在container定義了backgroundProcess()方法,并且其基礎抽象類containerbase確保在啟動組件的同時,異步啟動后臺處理。因此,在絕大多數情況下,各個容器組件只需要重寫該方法即可,不必考慮創建異步線程。
感謝各位的閱讀,以上就是“Tomcat架構設計原理是什么”的內容了,經過本文的學習后,相信大家對Tomcat架構設計原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。