Tomcat组件架构与数据流

news2024/9/23 17:15:37

一、背景与简介

        Tomcat我们都知道是一个开源的、实现了大部分Java EE、Servlet、JSP规范的Servlet容器, 允许我们将实现了Serlvet接口的Web程序war包进行部署运行。 但是你有对Tomcat做过细致的学习么?  我相信大部分同学和我一样,之前也是只会进行简单使用,如启动、停止、部署Web应用程序等, 对其工作原理和组件架构没有深入去学习。 趁着机会,我们一起深入学习Tomcat组件架构和数据流向。

        除了开源版本的Servlet容器: Tomcat, 我们也还听到或者使用过一些闭源商业的Servlet容器/应用服务器, 例如Oracle的WebLogic、IBM的WebSphere等。

二、Tomcat组件架构图

1、整体介绍

        Tomcat的组件之间是存在层次结构的:

                 1、首先整个Tomcat我们称为一个Server, 这个Server就是Tomcat, 有且只有1个

                 2、一个Server可以存在多个Service, 每个Service必须存在一个【Connector连接器组件(Coyote框架)】或者多个Connector连接器、有且只有1个【Container组件(Catalina)】 
                 3、Container组件(Catalina)存在一个Engine组件, Engine组件存在多个Host虚拟主机

                 4、每个Host虚拟主机又存在多个Context, 一个Context可以认为就是一个Web应用

                 5、每个Context又存在多个Warpper, 一个Warpper包含一个Servlet类

2、Connector连接器组件(Coyote)

        Connector连接器组件,默认使用Coyote框架实现。 Connector连接器是Tomcat构成的两大组件之一。

        Connector本质上就是针对一些应用层协议进行管理以及解析相关工作的组件, 例如单纯处理HTTP1.1协议的解析、响应等相关工作,可以理解这个组件就是Tomcat内置了HTTP服务器要实现的功能,和Nginx的作用类似。   根据单一职责原则,Connector只处理与HTTP协议相关的工作内容, 之后将HTTP协议请求的Request对象转换为下一个组件Container Servlet容器所需要的ServletRequest对象, 后续业务逻辑的内容交给了Container组件进行实际业务处理,最后返回Response响应对象。

3、Container Sevlet容器组件(Catalina)

        Container容器组件,默认使用Catalina框架实现。 Container容器是Tomcat构成的另外一个重要组件。

        Container容器组件是整个Tomcat的核心组件,名为Catalina容器。 从启动脚本catalina.sh这些命名,足以彰显和整个Tomcat关系。  Container负责对Servlet对象进行生命周期管理、如初始化、调用doService方法、销毁、通过mapping URL映射找到对应的Servlet对象进行执行等等, 最后将Response信息返回给Connector连接器组件。

三、Tomcat数据处理流程

例如浏览器访问http://localhost:8080/myapp/路径,此时会经历以下流程:

        1、Connector的Endpoint子组件监听8080端口,接收客户端浏览器请求报文(TCP/Socket)

        2、经过Processor子组件处理,解析为应用层协议HTTP协议,将请求信息拿到进行封装为Request对象

        3、由于Container组件需要的是ServletRequest对象,直接传递Connector的Request对象,对方无法处理,所以通过子组件Adapter进行适配器转换,将Request对象转换为ServletRequest对象

        4、Container拿到请求数据,根据请求的域名查找对应的Host虚拟主机进行处理

        5、根据url找到对应Context应用为myapp, 查找myapp/WEB-INFO/web.xml,根据web.xml的mapping映射关系定位到对应的Servlet

        6、定位到具体Servlet,根据请求方法get或者post调用对应doGet、doPost方法,最后返回ServletResponse对象给Connector

        7、Connector连接器拿到ServletResponse对象通过子组件Adapter转换为Response对象,最后将响应请求的内容返回给浏览器客户端

四、参数调优建议

1、JVM参数调优

        Tomcat本质就是一个Java进程,Java进程自然就是一个JVM虚拟机, 那就是对JVM的一些参数调优.

1、堆内存大小、元空间内存大小、新生代和老年代内存比例优化

例如-Xmx、-Xms等

2、GC垃圾回收器算法选择

GC垃圾回收器算法, 例如CMS、G1、Serinal等等

2、Connector参数调优

1、最大连接数、线程数、最大排队数量

maxConnections、maxThreads、acceptCount

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

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

相关文章

RisingWave 中文用户文档上线,阅读更高效!

为满足广大中文社区用户、开发者及流处理技术爱好者的需求,RisingWave 用户文档中文社区版今天上线了! 中文版文档的推出,旨在为广大用户提供更便捷、高效的阅读体验,帮助大家深入理解并有效使用 RisingWave,发挥其更…

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行,中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制,则程序总是从上往下依次执行,排在前面的代码先执行&#xf…

1897_野火FreeRTOS教程阅读笔记_链表

1897_野火FreeRTOS教程阅读笔记_链表 全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 之前我自己通过直接啃代码的方式对FreeRTOS也算是有了一点理解了,这次趁着些许闲暇翻看一下野火的FreeRTOS教程。一者算是一种复习;二者可能对自…

【数据结构】二叉树的顺序结构及链式结构

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 ​编辑 1.3树的表示 1.4树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1二叉树的概念 2.2现实中的二叉树 ​编辑 2.3特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储结…

手把手教你设计接口自动化测试用例:提取接口信息并分析

随着市场需求的变化,大部分企业在招聘测试人员时,都会提出接口自动化测试的相关要求,为什么会这样呢? 目前,软件构架基本上都是前后端分离的,软件的主要功能由服务端提供。从整个软件测试市场来看&#xf…

政安晨:快速学会~机器学习的Pandas数据技能(三)(重命名与合并)

使用机器学习处理数据的第一步就得先理解它,咱们现在就帮助它们一起理解起来。 (本篇文章这次换一套数据集,数据文件可以在文章头部下载,并保存至您的虚拟环境的目录中) 不知道如何搭建环境的小伙伴请看我机器学习笔…

超九成飘红,银行成开年唯一逆势上涨板块

2024年开年以来,A股银行板块表现令人瞩目。 Choice数据显示,按照申万(2021,仅A股)分类,2024年开年以来,银行板块是唯一一个逆势上涨板块,平均涨幅为6.53%。 年内银行股近乎全线上涨…

【C语言期末】商品管理系统

本文资源:https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括:包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求:1、信息首先保存在文件中,然后打开文件进行…

GPT4技术报告介绍

GPT4_Technical_Report_zh 我们创建了 GPT-4,这是 OpenAI 努力扩展深度学习的最新里程碑。GPT-4 是一个大型多模态模型(接受图像和文本输入,发出文本输出),虽然在许多现实世界场景中的能力不如人类,但在各…

Netty的序列化之MessagePack

目录 引入MessagePack依赖 实体类 服务端代码 客户端代码 执行结果 引入MessagePack依赖 <dependency><groupId>org.msgpack</groupId><artifactId>msgpack</artifactId><version>0.6.12</version></dependency> 实体类…

Stable Diffusion 模型下载:GhostMix(幽灵混合)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 GhostMix 是绝对让你惊艳的模型&#xff0c;也是自己认为现在最强的2.5D模型。我认为模型的更新应该是基于现有的画面整体不大变的前提下&#xff0c;提高模型的成…

springboot167基于springboot的医院后台管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

大数据术语系列(1)——COW和MOR,我如何使用chatgpt通俗易懂地理解了hudi这两种表类型

从传统数据库到大数据的转变&#xff0c;首当其冲的是各种术语的理解。 所以我与chatgpt发生了一系列对话&#xff0c;以便于我能快速理解这些术语。 我先把汇总的结果放在前边&#xff0c;后边会一步步地来说明我是如何获取这些信息的。前边我也发过一些关于chatgpt提示词相…

图像处理入门:OpenCV的基础用法解析

图像处理入门&#xff1a;OpenCV的基础用法解析 引言OpenCV的初步了解深入理解OpenCV&#xff1a;计算机视觉的开源解决方案什么是OpenCV&#xff1f;OpenCV的主要功能1. 图像处理2. 图像分析3. 结构分析和形状描述4. 动态分析5. 三维重建6. 机器学习7. 目标检测 OpenCV的应用场…

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨&#xff0c;大家好&#xff01;我是波罗学。 本文是系列文章 Go 技巧第十五篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 我们先看这样一个问题&#xff1a;“Go 语言中&#xff0c;将 byte 转换为 int 时是否涉及字节序&#xff08;endianness&#xff09;&#x…

Verilog刷题笔记26

题目&#xff1a; Build a combinational circuit with 100 inputs, in[99:0]. There are 3 outputs: out_and: output of a 100-input AND gate. out_or: output of a 100-input OR gate. out_xor: output of a 100-input XOR gate. 解题&#xff1a; module top_module( …

springboot157基于springboot的线上辅导班系统的开发与设计

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

数字图像处理实验记录八(图像压缩实验)

前言&#xff1a;做这个实验的时候很忙&#xff0c;就都是你抄我我抄你了 一、基础知识 1&#xff0e;为什么要进行图像压缩&#xff1a; 图像的数据量巨大&#xff0c;对计算机的处理速度、存储容量要求高。传输信道带宽、通信链路容量一定&#xff0c;需要减少传输数据量&a…

字节跳动公益平台“公益聚力计划”上线

为更好地联合社会多方力量参与社会公益&#xff0c;字节跳动公益平台于近日正式推出“公益聚力计划”&#xff08;以下简称“计划”&#xff09;。“计划”支持公益项目的策划与筛选、公益机构撮合&#xff0c;以及多种定制化的产品功能&#xff0c;如定制版公益证书、爱心回礼…

深入探索:缓冲区溢出漏洞及其防范策略

在网络安全的广阔领域中&#xff0c;缓冲区溢出漏洞一直是一个重要的议题。这种漏洞&#xff0c;如果被恶意利用&#xff0c;可能会导致严重的安全问题&#xff0c;包括数据泄露、系统崩溃&#xff0c;甚至可能被攻击者利用来执行恶意代码。在本文中&#xff0c;我们将深入探讨…