tomcat原理、結構、設計模式

1?what

一種web服務器,運行java servlet、jsp技術,能為java web提供運行環境并通過http協議處理客戶端請求。即tomcat = http服務器+ servlet容器。同類產品有jetty

  • Web應用:Web應用是指通過Web瀏覽器訪問的應用程序,它使用Web技術和標準(如HTTP、HTML、CSS、JavaScript等)來提供用戶界面和與用戶的交互。Web應用可以包括前端和后端組件,前端負責用戶界面和展示,后端負責業務邏輯和數據處理。
  • Servlet:Servlet是Java EE規范的一部分,它是一種運行在服務器端的Java程序,用于接收客戶端(如Web瀏覽器)的請求、處理這些請求(包括訪問數據庫、調用業務邏輯等),并返回響應給客戶端。Servlet是構建動態Web內容的核心技術之一

2 結構

連接器connector+容器container

容器就是engine、host、context、servlet/wrapper

所以架構就是service(8080端口)、connector、engine、host(http:localhost.com)、context(/mvc,一個web應用程序)、servlet/wrapper(/add,一個servlet)

f090bd57045f4088948e1e7da63585ca.png

?

3?關鍵組件

3.1 connector

3.1.1 Endpoint

用于:網絡層通信tcp/ip,如NIO\NIO2

3.1.2 Processor

用于:應用層協議解析,如http

3.1.3 Adapter

用于:統一轉換。tomcat request/response 轉為servlet request/response,從而傳給容器container。

  • servlet request是Java Servlet API 中的一個關鍵接口。
  • Java Servlet API是Java EE(現稱為Jakarta EE)中用于開發服務器端Java應用程序的一套接口和類。Servlet是JavaWeb的三大組件之一(Servlet、Filter、Listener),它主要用于處理客戶端的請求并生成響應。

3.2 設計模式

3.2.1 變動點和不變點的設計思路

不變點用抽象類、接口(如ProtocoHanlder、AbstrctProtocol),變點用具體類實現(如Http11NioProtocol、Http11Nio2Protocol)

47fd583736914b5e9911f0e38c739565.png

27e141a1618a4d7b8977cd9fc5a4f24a.png

f646124c6f57416c8648621ea75dbfa3.png

2357e1b0231e4de2b32e8c70f79b00b6.png

6fc9747fa2b14a649d16a3e70e00650d.png

d81414cef6f5481a87660f58599c0e96.png

3.2.2 適配器模式

Adapter,tomcat用CoyoteAdapter。


3.2 container

3.2.1 如何管理engine、host、context、servlet,用組合模式,讓他們都實現Container

  • 組合模式(Composite Pattern)是一種結構型設計模式,它允許你將對象組合成樹形結構以表示“部分-整體”的層次結構。在這種模式中,客戶端對單個對象和復合對象的使用具有一致性,即客戶端能夠以相同的方式處理單個對象和它們的組合。

說白了就是,用一個類/接口組裝成樹結構(有父子關系),這就是組合了,然后因為都是實現同一個接口,所以對每個部分的調用都是一樣的。如下圖

d785e0ea64ad4fb6952f9460fcbef154.png

3.2.2 engine、host、context、servlet是順序調用,用的是責任鏈模式Pipeline-Valve

pipeline是責任鏈,是隊列,隊列中的元素是valve。valve能執行處理邏輯,并轉給下一個value。

valve和filter的區別:valve是tomcat的,filter是java servlet api的。valve工作再web容器級別,攔截所有應用請求,filter工作在應用級別,攔截某個web應用請求

08b1200a4585496e98a08c964952573a.png

3635bb9b0a7c46a1997621631c00212c.png

acb7a18568bd41c1b4ded295aeee2060.png

d28296d8ebba41d5acc6c209df8c0538.png

3.2.3 engine管生命周期和分配請求

分配請求:映射mapper組件。根據url一層層找到對應的wrapper。

生命周期:負責容器創建、初始化、啟動、銷毀等。每個Container都繼承了LifeCycle。所以也是個組合模式。

還用到了觀察者模式(監聽變更生命周期狀態)、

組合模式(樹結構即有父子關系)、

模板設計模式(寫通用模板(通用邏輯),模板里面調用新方法,新方法走具體實現)

?

4 架構設計

  1. 羅列需求
  2. 面向對象設計類
  3. 找出需求中的變動點和不變點
  4. 變動點用抽象類,不變點用具體類實現

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41697.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

平臺穩定性里程碑 | Android 15 Beta 3 已發布

作者 / 產品管理副總裁、Android 開發者 Matthew McCullough 從近期發布的 Beta 3 開始,Android 15 達成了平臺穩定性里程碑版本,這意味著開發者 API 和所有面向應用的行為都已是最終版本,您可以查閱它們并將其集成到您的應用中,并…

HTML 標簽列表(功能排序)

HTML 標簽列表(功能排序) HTML(超文本標記語言)是構建網頁的標準語言,它定義了網頁的結構和內容。HTML包含眾多標簽,每個標簽都有其特定的功能和用途。本文將按照功能對HTML標簽進行分類和排序,以幫助您更好地理解和使用這些標簽。 基礎結構標簽 <!DOCTYPE html>…

使用Node.js 框架( Express.js)來創建一個簡單的 API 端點

文章目錄 使用Node.js 框架&#xff08; Express.js&#xff09;來創建一個簡單的 API 端點什么是express安裝修改代碼 express 自動刷新 使用Node.js 框架&#xff08; Express.js&#xff09;來創建一個簡單的 API 端點 什么是express Express 是一個保持最小規模的靈活的 …

系統架構設計師——計算機體系結構

分值占比3-4分 計算機硬件組成 計算機硬件組成主要包括主機、存儲器和輸入/輸出設備。 主機&#xff1a;主機是計算機的核心部分&#xff0c;包括運算器、控制器、主存等組件。運算器負責執行算術和邏輯運算&#xff1b;控制器負責協調和控制計算機的各個部件&#xff1b;主存…

如何看自己電腦的ip地址?這些方法教你搞定

在數字化時代&#xff0c;網絡已經成為我們生活中不可或缺的一部分。對于每一個接入網絡的設備來說&#xff0c;IP地址就像是一個獨特的身份證&#xff0c;它標識著設備在網絡中的位置。對于電腦用戶而言&#xff0c;了解如何查看自己電腦的IP地址&#xff0c;不僅有助于我們更…

Linux設備驅動器 之一 工作(worker)線程

Linux設備驅動器之一 工作線程 數據結構Linux APIs產生工作線程 kthread_create_worker初始化工作 kthread_init_work排隊工作 kthread_queue_work 在Linux中的應用實列SPI 驅動器與imx SPI任務工作線程代碼啟動任務工作線程 工作線程&#xff08;worker&#xff09;Linux管理線…

14-44 劍和詩人18 - 你想怎么應用 RAG 與微調

?????? 要充分發揮 LLM 的潛力&#xff0c;需要在檢索增強生成 (RAG) 和微調之間選擇正確的技術。 讓我們研究一下何時針對 LLM、較小模型和預訓練模型使用 RAG 而不是微調。我們將介紹&#xff1a; LLM 和 RAG 的簡要背景RAG 相對于微調 LLM 的優勢何時針對不同模型大…

AI集成工具平臺一站式體驗,零門檻使用國內外主流大模型

目錄 0 寫在前面1 AI藝術大師1.1 繪畫制圖1.2 智能作曲 2 AI科研助理2.1 學術搜索2.2 自動代碼 3 AI智能對話3.1 聊天機器人3.2 模型競技場 4 特別福利 0 寫在前面 人工智能大模型浪潮滾滾&#xff0c;正推動著千行百業的數智化進程。隨著技術演進&#xff0c;2024年被視為是大…

linux修改內核實現禁止被ping

概述 Linux默認允許被ping。其主要決定因素為&#xff1a; 內核參數防火墻&#xff08;iptables/firewall&#xff09; 以上的決定因素是與的關系&#xff0c;即需要均滿足。 因此&#xff0c;修改linux禁被ping有以上兩種方法可以實現。 修改內核文件使禁ping 1. 臨時生…

服務預約自動化:智能機器人引領預約新潮流

在數字化時代&#xff0c;服務預約的需求日益增長&#xff0c;智能機器人以其自動化和智能化的特性&#xff0c;正在重塑服務預約的流程。 一、服務預約的現代挑戰 服務預約流程面臨的挑戰包括用戶操作復雜、等待時間長、個性化服務難以滿足等。 二、智能機器人的優勢 智能…

Perl 語言入門:編寫并執行你的第一個腳本

摘要 Perl 是一種高級、通用的、解釋型、動態編程語言&#xff0c;以其強大的文本處理能力而聞名。本文將指導初學者如何編寫和執行他們的第一個 Perl 腳本&#xff0c;包括 Perl 的基本概念、腳本的基本結構、運行 Perl 腳本的方法以及一些簡單的 Perl 語法。 引言 Perl&am…

保健品商城小程序模板源碼

保健品商城小程序模板源碼 簡潔通用的保健品&#xff0c;健康生活&#xff0c;零售商品&#xff0c;電子商務微信小程序前端模板下載。包含&#xff1a;主頁、購物車、客服、個人中心、我的訂單、商品詳情、我的錢包、設置等等。 保健品商城小程序模板源碼

定制化模型煉金術:Mojo模型與自定義訓練循環的動態融合

定制化模型煉金術&#xff1a;Mojo模型與自定義訓練循環的動態融合 在機器學習領域&#xff0c;模型訓練循環是構建智能系統的核心過程。Mojo模型&#xff0c;作為H2O.ai提供的一種模型部署格式&#xff0c;主要用于模型的序列化和預測。雖然Mojo模型本身不支持自定義訓練循環…

web安全基礎名詞概念

本節內容根據小迪安全講解制作 第一天 域名&#xff1a; 1.1什么是域名&#xff1f; 網域名稱(英語&#xff1a;Domain Name&#xff0c;簡稱&#xff1a;Domain)&#xff0c;簡稱域名、網域&#xff0c;是由一串用點分隔的字符組成的互聯網上某一臺計算機或計算機組的名稱&a…

celery執行任務報錯ValueError: not enough values to unpack

背景 在做用戶注冊模塊的時候需要對手機號驗證的過程進行優化&#xff0c;目前想到的方式是通過celeryrabbitmq的方式進行異步處理&#xff0c;選擇使用celery是因為使用方便、性能好、可分布式部署。 環境信息 目前使用地win11容器化啟動 rabbitmq:3.13.2 python:3.6.8 cel…

OEACLE怎么實現AES加密解密

在Oracle數據庫中實現AES加密解密&#xff0c;通常會使用Oracle提供的DBMS_CRYPTO包。DBMS_CRYPTO是一個強大的PL/SQL包&#xff0c;用于加密和解密數據&#xff0c;支持多種加密算法&#xff0c;包括AES。以下是實現AES加密解密的具體步驟和示例&#xff1a; 一、確保權限 首…

高薪程序員必修課-JVM創建對象時如何解決多線程內存搶占問題

前言 在JVM中&#xff0c;堆的內存分配過程涉及到線程安全性的保障&#xff0c;具體來說涉及到對象的內存分配時&#xff0c;并不是簡單的搶占式分配&#xff0c;而是通過一些機制來保證線程安全和高效的內存管理。下面解釋一下JVM是如何設計來保證線程安全的&#xff1a; 內存…

Oracle怎么實現RSA加密解密

Oracle數據庫實現RSA加密解密通常需要通過Java編寫的存儲過程來完成&#xff0c;因為Oracle自身并不直接支持RSA加密的原生函數。以下是實現RSA加密解密的大致步驟和考慮因素&#xff1a; 一、準備Java類 編寫Java類&#xff1a; 創建一個Java類&#xff08;如RSACrypto&…

STA:延遲為什么會有負值?

我正在「拾陸樓」和朋友們討論有趣的話題&#xff0c;你?起來吧&#xff1f; 拾陸樓知識星球入口 相關文章鏈接&#xff1a; STA&#xff1a;串擾延遲分析 STA&#xff1a;CRPR悲觀路徑移除 這個問題就是典型的SI問題&#xff0c;受SI影響&#xff0c;與hold 分析而言data…

AI Native 入門案例教程

環境準備 1. 安裝 AI Native 首先&#xff0c;需要安裝 AI Native。可以通過 pip 安裝&#xff1a; pip install ainative2. 安裝 TensorFlow AI Native 是基于 TensorFlow 的&#xff0c;因此需要安裝 TensorFlow。可以通過 pip 安裝&#xff1a; pip install tensorflow…