一次请求的来龙去脉 - Tomcat架构解析(一)

news2025/2/21 23:08:34

> Tomcat作为我们学习JavaEE的一个重要的web服务器,对整个请求的来龙去脉有所了解,将直接使得我们对JavaEE的学习更加的事半功倍。并且深入了解Tomcat架构设计之后,将使得我们在以后搭建自己的项目架构提供借鉴。那么接下来,我们先给大家阐述一下Tomcat的架构是如何设计的,在设计的时候又是如何一步一步的考虑进行的优化升级。
 

      1.总体架构
 

  > 其实只要我们使用过Tomcat,那么就应该可以猜测得出,Tomcat其实是包含了两个核心功能:
 

  处理socket请求,实现字节流数据和Request对象、Response对象的转化
 

  管理Servlet,执行servlet来处理请求,响应请求

  2. 连接器
 

  > 为了更好的处理上面的两件事情,Tomcat 设计出来了两个组件:连接器和容器, 其中连接器用来接收请求,处理数据,封装成Request和response对象,对请求作出响应。容器负责管理servlet,调用servlet,得到响应返回给连接器,然后返回给客户端。

  2.1 Service组件
 

  > 连接器和容器单独工作,并不能完成所有的内容。必须让它们组合起来一起协作。为了更好的管理他们,Tomcat使用了叫做: Service的组件来包装它们, Service并没有任何的新鲜的功能,仅仅是包装了连接器和容器而已。事实上,在Tomcat中,可以配置很多组service组件, 这样就可以通过不同的端口号来访问在Tomcat中部署的不同项目了。

  从上图可以看出在在一个Tomcat可以包含一个Server实例,其实Server实例就是Tomcat实例。而一个Server实例可以拥有一个或者多个Service实例,一个 Service 中有多个连接器和一个容器。连接器之所以设计为多个,主要是为了方便客户端可以通过不同的协议来发送请求。而容器只需要一份即可,因为它只需要管理servlet即可。连接器和容器是通过标准的ServletRequest和ServletResponse对象通讯的。
 

  2.1.1 连接器
 

  > 连接器的作用: 是为了接收客户端的请求,并且对socket请求进行数据读取,分析,然后封装成`ServletRequest` 对象,传输给容器。为了更好的实现功能内聚、分工明确,Tomcat设计了3个组件来完成这些功能: Endpoint、Processor和Adapter。 为了更好的处理协议,Tomcat还使用 ProtocolHandler来对Endpoint和Processor进行了封装。
 

  Endpoint
 

  > Endpoint 作为通信端点,是一个接口 , 具体的 Socket 接收和发送处理器 ,属于TCP/IP的具体实现。 具体的实现类有: AbstractEndpoint 。 它有两个重要的组件:Acceptor 和 SocketProcessor 。 其中: Acceptor用来监听请求,SocketProcessor用来处理接收到的socket请求,它实现了Runnable接口,最终会被提交到线程池里面执行。
 

  Processor
 

  > Processor则是实现Http协议的具体实现。负责把Endpoint接收到的请求里面的数据解析成Tomcat的Request对象。
 

  Adapter
 

  > 由于客户端可以使用不同的协议来发送请求,Tomcat 接收到请求后,交由ProtocolHandler来解析并且封装成Request对象。但是想要传输给Servlet,还需要经过一次转化。这个转化的重任就落在了Adapter身上。
 

  >
 

  > 它的具体实现是: CoyoteAdapter,这个哥们属于典型的适配器模式。把传递过来的Tomcat的Request类型转化成了后续容器需要用到的ServletRequest对象。

  3. 总结
 

  Tomcat 的整体架构包含了两个核心组件连接器和容器。连接器负责对外交流,容器负责内部处理。连接器用 ProtocolHandler 接口来封装通信协议和 I/O 模型的差异,ProtocolHandler 内部又分为 Endpoint 和 Processor 模块,Endpoint 负责底层 Socket 通信,Processor 负责应用层协议解析。连接器通过适配器 Adapter 调用容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22659.html

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

相关文章

DOTA-PEG-葡萄糖 DOTA-葡萄糖

DOTA-PEG-葡萄糖 DOTA-葡萄糖 中文名称:葡萄糖-四氮杂环十二烷四乙酸 英文名称:Glucose-DOTA 别称:DOTA修饰葡萄糖,DOTA-葡萄糖 PEG接枝修饰葡萄糖 葡萄糖-聚乙二醇-四氮杂环十二烷四乙酸 DOTA-PEG-葡萄糖 纯度&#xff1a…

Vue--》简述组件的数据共享

目录 组件数据共享 父组件向子组件共享数据 子组件向父组件共享数据 兄弟组件共享数据 组件数据共享 组件之间的关系:在项目开发中,组件之间的最常用的关系分为两种:父子关系和兄弟关系。 父组件向子组件共享数据 通过自定义属性实现父…

进大厂必备的 Java 八股文大全(2022 最强精简易懂版)

很多同学会问 Java 面试八股文有必要背吗? 答案是,必须背,博主是个三本,今年凭借这篇八股文斩获了多个大厂暑期实习 offer,相信秋招一定也可以发挥重要作用。 你可以讨厌这种模式,但你一定要去背&#xf…

【Kafka从成神到升仙系列 四】你真的了解 Kafka 的缓存池机制嘛

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,Java领域新星创作者📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…

垃圾回收器(宋红康JVM学习笔记)

垃圾回收器分类 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是同一时间内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直到垃圾收集工作结束。 并行收集可以运用多个CPU同时执行垃圾回收&#xff0c…

Bootstrap实现个人blog项目(1+X Web前端开发中级 例题)——初稿

📄题目要求 阅读下列说明、效果图和HTML代码,进行静态网页开发,填写(1)至(20)代码。🧩说明 这是个人blog项目,该项目的目录是myblog,现在我们需要编写该blog…

在地图上可视化地理空间数据的12种方法

地图绘制或制图是地理空间数据的可视化。它是一门艺术,因其寻求以一种更容易被非技术受众理解或解释的形式来表示数据。但它也是一门确保视觉效果与所基于的数据准确一致的科学。鉴于地图的优势和局限性,一些样式的地图在表示某些类型的信息方面比其他样…

PTA题目 福到了

“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N N 的网格组成的,网格中的元素或者为字符 或者为空格。而倒过来的汉字所用的字符由裁判指定。 输…

原来 GitHub 不仅能学代码,还有这些东西

今天介绍几个很有意思的 github 开源项目,看过之后就会发现,github 果然深意暗藏。 github 作为一个若隐若现(有时墙有时不墙)的网站,对于程序员来说,再熟悉不过了,绝大多数时候,我…

铁死亡化合物库

铁死亡是 2012 年新发现的一种细胞死亡机制,目前已经成为科研领域的研究热点。铁死亡是依赖铁离子及活性氧诱导脂质过氧化导致的调节性细胞坏死,其在形态学、生物学及基因水平上均明显不同于凋亡、坏死、自噬等其他形式的程序性性细胞死亡。铁死亡在形态…

详解:自增ID与UUID的优缺点及选择建议,MySQL有序uuid与自定义函数实现

文章目录1.自增ID的优缺点1.1 优点1.2 缺点1.3 不适合以自增ID主键作为主键的情况2.UUID作为主键2.1 介绍2.2 优点2.3 缺点3.有序UUID作为主键3.1 介绍3.2 演示使用3.2.1 前提知识3.2.1.1 数据类型 - binary3.2.1.2 函数 - hex()3.2.1.3 函数 - unhex()3.2.2 数据库层3.2.3 JAV…

Mybatis的二级缓存 (ehcache方式)

目录前置pom: jar配置文件: ehcache.xml配置指定方式恢复 .index 文件 (ApplicationClosedEventListener.java)效果图前置 会演示二级缓存生效/失效的场景 项目地址: https://gitee.com/xmaxm/test-code/blob/master/chaim-cache/chaim-mybatis-cache/chaim-mybatis-cache-two…

基于PHP+MySQL汽车票订票系统的设计与实现(含论文)

从前,对汽车站的管理和规范问题一直是困扰政府的一个大难题,如何让人们方便快捷的买到自己想去的城市的票一直是一个问题。 但是现在,随着时代的飞速发展,交通越来越发达,人们可以更加方便的去各个城市,回家也好,旅游也好,当然,科学技术也在提高,出现了网上购票的新的购票方式,…

redux 和 react-redux

Redux 一、redux 工作流 二、创建 redux npm install redux src/redux/languageReducer.ts 数据处理逻辑 // 数据类型 export interface LanguageState {language: "en" | "zh"languageList: {name: string

Springboot 小巧简便的限流器使用 RateLimiter

前言 之前,写过一篇基于redis限流,能应用到分布式相关场景:(Redis使用系列) Springboot 使用redis实现接口Api限流 十_小目标青年的博客-CSDN博客 也在很久之前,写过一个使用也非常便捷的,整合…

Google Earth 成长历程的15个小故事

利用 Google Earth,可以像宇航员一样从太空中看到我们的星球,只需点击或轻触几秒钟就可以在地球上的任何地方旅行。如今的 Google Earth 仍然是世界上最大的可公开获取的地理图像存储库。它将航空摄影、卫星图像、3D 地形、地理数据和街景组合成一幅可以…

web前端面试-10大经典题(HTML基础)

HTML基础 1. HTML 文件中的 DOCTYPE 是什么作用? HTML超文本标记语言: 是一个标记语言, 就有对应的语法标准 DOCTYPE 即 Document Type,网页文件的文档类型标准。 主要作用是告诉浏览器的解析器要使用哪种 HTML****规范 或 XHTML****规范 来解析页面…

项目部署与拉取Github/Gitlab/Gitee的合理步骤以及会遇到的问题

踩了很多坑,总结一下。首先有两种需求,第一种是本地的项目部署到Github上,第二种是将团队的项目拉到本地。 (初始)本地 -> GitHub 因为本地到Github有可能是第一次去推送代码,也有可能是你更改了拉下来…

12V铅酸电池充放电保护板

现有铅酸电池特性: 重量:3斤电压范围:13.5~13.8V 14.4V~14.7V最大输出电流:2.16A 选用芯片:CN3768,4A,12V铅酸电池充放电管理集成电路 概述 CN3768是PWM降压模式12V铅酸电池充电管理集成…

关于python函数,你该了解这些

目录 1.创建一个函数 举例 2.调用函数 形参 实参 位置参数 关键字参数 可变长参数 其他 变量的作用域 全局变量 局部变量 3.匿名函数 1.创建一个函数 语法格式 def functionname([parameterlist]):[functionbody] functionname:函数名称,在调用函数时…