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.mzph.cn/web/41697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平台稳定性里程碑 | Android 15 Beta 3 已发布

作者 / 产品管理副总裁、Android 开发者 Matthew McCullough 从近期发布的 Beta 3 开始,Android 15 达成了平台稳定性里程碑版本,这意味着开发者 API 和所有面向应用的行为都已是最终版本,您可以查阅它们并将其集成到您的应用中,并…

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机:主机是计算机的核心部分,包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算;控制器负责协调和控制计算机的各个部件;主存…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代,网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说,IP地址就像是一个独特的身份证,它标识着设备在网络中的位置。对于电脑用户而言,了解如何查看自己电脑的IP地址,不仅有助于我们更…

14-44 剑和诗人18 - 你想怎么应用 RAG 与微调

​​​​​​ 要充分发挥 LLM 的潜力,需要在检索增强生成 (RAG) 和微调之间选择正确的技术。 让我们研究一下何时针对 LLM、较小模型和预训练模型使用 RAG 而不是微调。我们将介绍: 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 写在前面 人工智能大模型浪潮滚滚,正推动着千行百业的数智化进程。随着技术演进,2024年被视为是大…

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

保健品商城小程序模板源码 简洁通用的保健品,健康生活,零售商品,电子商务微信小程序前端模板下载。包含:主页、购物车、客服、个人中心、我的订单、商品详情、我的钱包、设置等等。 保健品商城小程序模板源码

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名: 1.1什么是域名? 网域名称(英语:Domain Name,简称:Domain),简称域名、网域,是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

celery执行任务报错ValueError: not enough values to unpack

背景 在做用户注册模块的时候需要对手机号验证的过程进行优化,目前想到的方式是通过celeryrabbitmq的方式进行异步处理,选择使用celery是因为使用方便、性能好、可分布式部署。 环境信息 目前使用地win11容器化启动 rabbitmq:3.13.2 python:3.6.8 cel…

高薪程序员必修课-JVM创建对象时如何解决多线程内存抢占问题

前言 在JVM中,堆的内存分配过程涉及到线程安全性的保障,具体来说涉及到对象的内存分配时,并不是简单的抢占式分配,而是通过一些机制来保证线程安全和高效的内存管理。下面解释一下JVM是如何设计来保证线程安全的: 内存…

STA:延迟为什么会有负值?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: STA:串扰延迟分析 STA:CRPR悲观路径移除 这个问题就是典型的SI问题,受SI影响,与hold 分析而言data…

Dify v0.6.9源码部署

一.前置条件 克隆Dify v0.6.9代码: git clone https://github.com/langgenius/dify.git在启用业务服务之前,需要先部署 PostgresSQL / Redis / Weaviate(如果本地没有的话),可以通过以下命令启动: cd do…

Data-Juicer:阿里巴巴荣誉出品的大模型数据清洗框架

Diffusion Models专栏文章汇总:入门与实战 前言:如何优雅地进行大规模数据清洗是一门艺术,特别对于大模型,数据的质量是决定模型成功最关键的因素之一。阿里巴巴最近开源了一项专门针对大语言模型和视频生成大模型的数据清洗框架&…

短信群发平台适用于哪些行业?

短信群发平台作为一种高效、快速且成本相对较低的通信方式,适用于多个行业。以下是一些主要适用行业的概述: 1. 零售与电商行业 应用场景:零售和电商企业可以利用短信群发进行新品推广、促销信息发布、订单状态更新、物流跟踪通知等。 2. 金…

redis并发、穿透、雪崩

Redis如何实现高并发 首先是单线程模型:redis采用单线程可以避免多线程下切换和竞争的开销,提高cpu的利用率,如果是多核cpu,可以部署多个redis实例。基于内存的数据存储:redis将数据存储在内存中,相比于硬…

【测试】系统压力测试报告模板(Word原件)

系统压力测试,简而言之,是在模拟高负载、高并发的环境下,对系统进行全面测试的过程。它旨在评估系统在面对极端使用条件时的性能表现,包括处理能力、响应时间、资源消耗及稳定性等关键指标。通过压力测试,开发团队能够…

上海-LM科技(面经)

上海-LM科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀(写出来即可) 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spring…

代码随想录——单调递增的数字(Leetcode738)

题目链接 贪心 class Solution {public int monotoneIncreasingDigits(int n) {char[] digits String.valueOf(n).toCharArray();int flag digits.length;for (int i digits.length - 1; i > 0; i--) {if (digits[i] < digits[i - 1]) {flag i;digits[i - 1]--;}}…

玉石风能否接棒黏土风?一探AI绘画新风尚

在数字艺术的浪潮中,AI绘画平台以其独特的创造力和便捷性,正在逐步改变我们对艺术的传统认知。从黏土风的温暖质感到琉璃玉石的细腻光泽,每一次风格的转变都引领着新的潮流。今天,我们将聚焦玉石风,探讨它是否能成为下一个流行的艺术滤镜,并提供一种在线体验的方式,让你…

Python | Leetcode Python题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:if len(matrix) 0 or len(matrix[0]) 0:return 0maxSide 0rows, columns len(matrix), len(matrix[0])dp [[0] * columns for _ in range(rows)]for i in…

Kafka(一)基础介绍

一&#xff0c;Kafka集群 一个典型的 Kafka 体系架构包括若Producer、Broker、Consumer&#xff0c;以及一个ZooKeeper集群&#xff0c;如图所示。 ZooKeeper&#xff1a;Kafka负责集群元数据的管理、控制器的选举等操作的&#xff1b; Producer&#xff1a;将消息发送到Broker…