当前位置: 首页 > news >正文

Tomcat组件架构与数据流

一、背景与简介

        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

相关文章:

Tomcat组件架构与数据流

一、背景与简介 Tomcat我们都知道是一个开源的、实现了大部分Java EE、Servlet、JSP规范的Servlet容器, 允许我们将实现了Serlvet接口的Web程序war包进行部署运行。 但是你有对Tomcat做过细致的学习么? 我相信大部分同学和我一样,之前也是只会进行简单使用&#x…...

AES算法:数据传输的安全保障

在当今数字化时代,数据安全成为了一个非常重要的问题。随着互联网的普及和信息技术的发展,我们需要一种可靠的加密算法来保护我们的敏感数据。Advanced Encryption Standard(AES)算法应运而生。本文将介绍AES算法的优缺点、解决了…...

前端小案例——动态导航栏文字(HTML + CSS, 附源码)

一、前言 实现功能: 这案例是一个具有动态效果的导航栏。导航栏的样式设置了一个灰色的背景,并使用flex布局在水平方向上平均分配了四个选项。每个选项都是一个li元素,包含一个文本和一个横向的下划线。 当鼠标悬停在选项上时,选项的文本颜色…...

前置机、堡垒机(跳板机)【2024-02-04】

文章目录 0、前言1、前置机1.1、概念1.2、功能1.3、使用场景1.4、总结 2、堡垒机2.1、概念2.2、功能2.3、使用场景2.4、总结 3、前置机和堡垒机3.1、设计理念与目的3.2、功能3.3、使用场景 0、前言 文章借鉴: https://blog.csdn.net/weixin_45565886/article/detai…...

从编程中理解:大脑的短期记忆和长期记忆

在编程中,我们可以将大脑的短期记忆和长期记忆类比为程序中的变量作用域和持久化存储。在Unity C#编程环境下,可以这样解释: 假设金庸武侠世界中的人物张无忌正在修炼九阳真经。我们用C#代码来模拟他学习武功的过程,其中涉及的“…...

Rust 本地文档的使用:rustup doc

Rust 是一种系统级编程语言,以其安全性、速度和内存控制能力而闻名。为了方便开发者更好地了解并利用 Rust 标准库和工具链中的功能,Rust 提供了一种内置的文档浏览方式——通过 rustup doc 命令。 安装 rustup 在查阅 Rust 文档之前,确保你…...

uni-app切换页面刷新,返回上一页刷新(onShow钩子函数的使用)

切换页面刷新:通过onShow()便可实现 返回上一页通过uni.navigateBack({delta: 1});实现 以返回上一页刷新为例 从B页面返回上一页到A页面,在A页面写入方法refreshHandler() //a.vue methods: { // 执行刷新逻辑refreshHandler() {uni.request({ur…...

adb 无线连接 操作Android设备

最近集五福活动比较热门 可以用这个工具 用自己擅长的语言写一个循环程序 运行起来就可以 自动帮我们 看视频得福卡了 很方便 while (true) {sleep(mt_rand(15, 25));system(adb shell input swipe 500 2000 500 1000 100); } 1. 首先下载 安卓开发工具 adb adb网盘链接 链接…...

春节运维不打烊:一体化运维高效保障企业IT与机房环境

随着技术的不断发展和企业数字化转型的深入,IT运维已经成为企业运营不可或缺的一部分。尤其在春节期间,一体化运维管理系统以其独特的技术特性和卓越的功能,为企业的稳定运行提供了坚实保障,确保了节日的祥和与工作的连续高效。 一…...

类银河恶魔城学习记录1-5 CollisionCheck源代码 P32

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; u…...

spring boot 使用 Kafka

一、Kafka作为消息队列的好处 高吞吐量:Kafka能够处理大规模的数据流,并支持高吞吐量的消息传输。 持久性:Kafka将消息持久化到磁盘上,保证了消息不会因为系统故障而丢失。 分布式:Kafka是一个分布式系统&#xff0c…...

LFU缓存(Leetcode460)

例题: 分析: 这道题可以用两个哈希表来实现,一个hash表(kvMap)用来存储节点,另一个hash表(freqMap)用来存储双向链表,链表的头节点代表最近使用的元素,离头节…...

Vue学习笔记:计算属性

计算属性 入门进阶二次进阶三次进阶四次进阶结界五次进阶六次进阶七次进阶八次进阶九次进阶终章彩蛋 入门 Vue.js中,计算属性示例: export default {data() {return {firstName: John,lastName: Doe};},computed: {// 计算属性:全名fullNam…...

深度学习本科课程 实验2 前馈神经网络

任务 3.3 课程实验要求 (1)手动实现前馈神经网络解决上述回归、二分类、多分类任务 l 从训练时间、预测精度、Loss变化等角度分析实验结果(最好使用图表展示) (2)利用torch.nn实现前馈神经网络解决上述回归…...

【python】python爱心代码【附源码】

一、实现效果: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码: import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…...

Linux---信号

前言 到饭点了,我点了一份外卖,然后又开了一把网游,这个时候,我在打游戏的过程中,我始终记得外卖小哥会随时给我打电话,通知我我去取外卖,这个时候游戏还没有结束。我在打游戏的过程中需要把外…...

24种设计模式之行为型模式(下)-Java版

软件设计模式是前辈们代码设计经验的总结,可以反复使用。设计模式共分为3大类,创建者模式(6种)、结构型模式(7种)、行为型模式(11种),一共24种设计模式,软件设计一般需要满足7大基本原则。下面通过5章的学习一起来看看设计模式的魅…...

基于微信小程序的校园水电费管理小程序的研究与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …...

k8s 部署 nocas 同时部署mysql

使用 ygqygq2 的 helm 模板部署 官方地址:https://artifacthub.io/packages/helm/ygqygq2/nacos 添加 helm 仓库 helm repo add ygqygq2 https://ygqygq2.github.io/charts/下载 helm 安装文件 helm pull ygqygq2/nacos解压 tar -zxvf nacos-2.1.6.tgz执行 hel…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...