一文弄懂 Apache Tomcat

文章目录

  • 1. Tomcat 系统架构与原理剖析
    • 1.1 浏览器访问服务器的流程
    • 1.2 Tomcat 请求处理⼤致过程
    • 1.3 Tomcat Servlet容器处理流程
    • 1.4 Tomcat 核心组件
      • 1.4.1 Coyote 连接器
      • 1.4.2 Coyote 的内部组件及流程
      • 1.4.3 Tomcat Servlet 容器 Catalina
      • 1.4.4 Container 组件的具体结构
  • 2. Tomcat 服务器核⼼配置详解
  • 3. Tomcat请求处理流程
  • 4. Tomcat 类加载机制剖析
    • 4.1 JVM 的类加载机制
    • 4.2 双亲委派机制
    • 4.3 Tomcat 的类加载机制
  • 6. Tomcat 对 Https 的⽀持及 Tomcat 性能优化策略
    • 6.1 Tomcat 对 HTTPS 的⽀持

1. Tomcat 系统架构与原理剖析

1.1 浏览器访问服务器的流程

在这里插入图片描述

1.2 Tomcat 请求处理⼤致过程

Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器)
我们使⽤浏览器向某⼀个⽹站发起请求,发出的是Http请求,
那么在远程,Http服务器接收到这个请求之后,会调⽤具体的程序(Java类)进⾏处理,往往不同的请求由不同的Java类完成处理。

HTTP 服务器接收到请求之后把请求交给Servlet容器来处理,Servlet 容器通过Servlet接⼝调⽤业务 类。Servlet接⼝和Servlet容器这⼀整套内容叫作Servlet规范。

Tomcat的两个重要身份

  1. http服务器
  2. Tomcat是⼀个Servlet容器

1.3 Tomcat Servlet容器处理流程

当⽤户请求某个URL资源时

  1. HTTP服务器会把请求信息使⽤ServletRequest对象封装起来
  2. 进⼀步去调⽤Servlet容器中某个具体的Servlet
  3. 中,Servlet容器拿到请求后,根据URL和Servlet的映射关系,找到相应的Servlet
  4. 如果Servlet还没有被加载,就⽤反射机制创建这个Servlet,并调⽤Servlet的init⽅法来完成初始化
  5. 接着调⽤这个具体Servlet的service⽅法来处理请求,请求处理结果使⽤ServletResponse对象封装
  6. 把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

1.4 Tomcat 核心组件

Tomcat 设计了两个核⼼组件连接器(Connector)和容器(Container)
来完成 Tomcat 的两⼤核⼼ 功能。

连接器,负责对外交流: 处理Socket连接,负责⽹络字节流与Request和Response对象的转化;

容器,负责内部处理:加载和管理Servlet,以及具体处理Request请求;

1.4.1 Coyote 连接器

Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应 。
(1)Coyote 封装了底层的⽹络通信(Socket 请求及响应处理)
(2)Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦
(3)Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处 理请求完成后, Catalina 通过Coyote 提供的Response 对象将结果写⼊输出流
(4)Coyote 负责的是具体协议(应⽤层)和IO(传输层)相关内容

在 8.0 之前 ,Tomcat 默认采⽤的I/O⽅式为 BIO,之后改为 NIO。 ⽆论 NIO、NIO2 还是 APR, 在性 能⽅⾯均优于以往的BIO。 如果采⽤APR, 甚⾄可以达到 Apache HTTP Server 的影响性能。

1.4.2 Coyote 的内部组件及流程

  1. EndPoint: EndPoint 是 Coyote 通信端点,即通信监听的接⼝,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint⽤来实现TCP/IP协议的
  2. Processor 是Coyote 协议处理接⼝ ,如果说EndPoint是⽤来实现TCP/IP协 议的,那么Processor⽤来实现HTTP协议,Processor接收来⾃EndPoint的 Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应⽤层协议的抽象
  3. Coyote 协议接⼝, 通过Endpoint 和 Processor , 实现针对具体协议的处 理能⼒。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol
  4. 由于协议不同,Tomcat定义了⾃⼰的 Request类来封装这些请求信息。ProtocolHandler接⼝负责解析请求并⽣成 Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能⽤Tomcat Request作为参数来调⽤容器。引 ⼊CoyoteAdapter,这是适配器模式的经典运⽤,连接器调⽤ CoyoteAdapter的Sevice⽅法,传⼊的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调⽤容器

1.4.3 Tomcat Servlet 容器 Catalina

Tomcat是⼀个由⼀系列可配置(conf/server.xml)的组件构成的Web容器,⽽Catalina是Tomcat的 servlet容器。

从另⼀个⻆度来说,Tomcat 本质上就是⼀款 Servlet 容器, 因为 Catalina 才是 Tomcat 的核⼼ , 其 他模块都是为Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。

1.4.4 Container 组件的具体结构

Container组件下有⼏种具体的组件,分别是Engine、Host、Context和Wrapper。这4种组件(容器)
是⽗⼦关系。Tomcat通过⼀种分层的架构,使得Servlet容器具有很好的灵活性

  1. Engine 表示整个Catalina的Servlet引擎,⽤来管理多个虚拟站点,⼀个Service最多只能有⼀个Engine, 但是⼀个引擎可包含多个Host
  2. Host代表⼀个虚拟主机,或者说⼀个站点,可以给Tomcat配置多个虚拟主机地址,⽽⼀个虚拟主机下 可包含多个Context
  3. Context 表示⼀个Web应⽤程序, ⼀个Web应⽤可包含多个Wrapper
  4. Wrapper表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器

2. Tomcat 服务器核⼼配置详解

核⼼配置在tomcat⽬录下conf/server.xml⽂件

  1. tomcat 作为服务器的配置,主要是 server.xml ⽂件的配置;
  2. server.xml中包含了 Servlet容器的相关配置,即 Catalina 的配置;
  3. Xml ⽂件的讲解主要是标签的使⽤

3. Tomcat请求处理流程

在这里插入图片描述

4. Tomcat 类加载机制剖析

Java类(.java)—> 字节码⽂件(.class) —> 字节码⽂件需要被加载到jvm内存当中(这个过程就是⼀个 类加载的过程)

类加载器(ClassLoader,说⽩了也是⼀个类,jvm启动的时候先把类加载器读取到内存当中去,其他的 类(⽐如各种jar中的字节码⽂件,⾃⼰开发的代码编译之后的.class⽂件等等))

要说 Tomcat 的类加载机制,⾸先需要来看看 Jvm 的类加载机制,因为 Tomcat 类加载机制是在 Jvm 类加载机制基础之上进⾏了⼀些变动。

4.1 JVM 的类加载机制

JVM 的类加载机制中有⼀个⾮常重要的⻆⾊叫做类加载器(ClassLoader),类加载器有⾃⼰的体系, Jvm内置了⼏种类加载器,包括:引导类加载器、扩展类加载器、系统类加载器,他们之间形成⽗⼦关系,通过 Parent 属性来定义这种关系,最终可以形成树形结构。

自定义类加载器 -> 系统类加载器 -> 扩展类加载器 -> 引导类加载器

引导启动类加载器 BootstrapClassLoader:
c++编写,加载java核⼼库 java.*,⽐如rt.jar中的类,构 造ExtClassLoader和AppClassLoader

扩展类加载器 ExtClassLoade
java编写,加载扩展库 JAVA_HOME/lib/ext⽬录下的jar 中的类,如classpath中的jre ,javax.*或者java.ext.dir
指定位置中的类

系统类加载器 SystemClassLoader/AppClassLoader
默认的类加载器,搜索环境变量 classpath 中指明的路 径

当 JVM 运⾏过程中,⽤户⾃定义了类加载器去加载某些类时,会按照下⾯的步骤(⽗类委托机制)
1) ⽤户⾃⼰的类加载器,把加载请求传给⽗加载器,⽗加载器再传给其⽗加载器,⼀直到加载器树的顶层
2 )最顶层的类加载器⾸先针对其特定的位置加载,如果加载不到就转交给⼦类
3 )如果⼀直到底层的类加载都没有加载到,那么就会抛出异常 ClassNotFoundException 因此,按照这个过程可以想到,如果同样在 classpath 指定的⽬录中和⾃⼰⼯作⽬录中存放相同的class,会优先加载 classpath ⽬录中的⽂件

4.2 双亲委派机制

当某个类加载器需要加载某个.class⽂件时,它⾸先把这个任务委托给他的上级类加载器,递归这个操
作,如果上级的类加载器没有加载,⾃⼰才会去加载这个类。

防⽌重复加载同⼀个.class。通过委托去向上⾯问⼀问,加载过了,就不⽤再加载⼀遍。保证数据 安全。
保证核⼼.class不能被篡改。通过委托⽅式,不会去篡改核⼼.class,即使篡改也不会去加载,即使 加载也不会是同⼀个.class对象了。不同的加载器加载同⼀个.class也不是同⼀个.class对象。这样 保证了class执⾏安全(如果⼦类加载器先加载,那么我们可以写⼀些与java.lang包中基础类同名 的类, 然后再定义⼀个⼦类加载器,这样整个应⽤使⽤的基础类就都变成我们⾃⼰定义的类了。 )

Object类 -----> ⾃定义类加载器(会出现问题的,那么真正的Object类就可能被篡改了)

4.3 Tomcat 的类加载机制

Tomcat 的类加载机制相对于 Jvm 的类加载机制做了⼀些改变。
没有严格的遵从双亲委派机制,也可以说打破了双亲委派机制
⽐如:有⼀个tomcat,webapps下部署了两个应⽤ app1/lib/a-1.0.jar com.lagou.edu.Abc app2/lib/a-2.0.jar com.lagou.edu.Abc
不同版本中Abc类的内容是不同的,代码是不⼀样的

6. Tomcat 对 Https 的⽀持及 Tomcat 性能优化策略

6.1 Tomcat 对 HTTPS 的⽀持

Http超⽂本传输协议,明⽂传输 ,传输不安全,https在传输数据的时候会对数据进⾏加密 ssl协议 TLS(transport layer security)协议

HTTPS和HTTP的主要区别

  1. HTTPS协议使⽤时需要到电⼦商务认证授权机构(CA)申请SSL证书
  2. HTTP默认使⽤8080端⼝,HTTPS默认使⽤8443端⼝
  3. HTTPS则是具有SSL加密的安全性传输协议,对数据的传输进⾏加密,效果上相当于HTTP的升级 版
  4. HTTP的连接是⽆状态的,不安全的;HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、身份认证的⽹络协议,⽐HTTP协议安全

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

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

相关文章

layui改造优化ITtools技术笔记01—layui.js重要修正

问题现象: ittools教学平台自动生成的单选按钮渲染后无法切换选项。 故障排查: input[name xxx],其中xxx含有特殊字符,如$等,导致layui渲染时,表达式出错,无法及时渲染。 解决方案&#xff1…

VINS-Fusion 回环检测pose_graph_node

VINS-Fusion回环检测,在节点pose_graph_node中启动。 pose_graph_node总体流程如下: 重点看process线程。 process线程中,将订阅的图像、点云、位姿时间戳对齐,对齐后分别存入image_msg、point_msg、pose_msg。pose_msg为VIO后端优化发布的位姿。 一、创建关键帧keyFram…

【虚拟化】虚拟化简介 | Hypervisor介绍

目录 一、什么是虚拟化? 二、虚拟化的优点 三、Hypervisor 3.1 Hypervisor概述 3.2 Hypervisor 分类 3.3 Hypervisor 与虚拟机协作技术路线 (1) 全虚拟化 (2) 硬件辅助虚拟化 (3) 半虚…

5G赋能新能源,工业5G路由器实现充电桩远程高效管理

随着5G技术的广泛应用,新能源充电桩的5G应用正逐步构建起全新的生态系统。在数字化转型的浪潮中,新能源充电桩行业正迎来数字化改革。工业5G路由器的引入,为充电桩的远程管理提供了强有力的技术支持,新能源充电桩5G路由器网络部署…

软考:软件设计师 — 5.计算机网络

五. 计算机网络 1. OSI 七层模型 层次名称主要功能主要设备及协议7应用层实现具体的应用功能 POP3、FTP、HTTP、Telent、SMTP DHCP、TFTP、SNMP、DNS 6表示层数据的格式与表达、加密、压缩5会话层建立、管理和终止会话4传输层端到端的连接TCP、UDP3网络层分组传输和路由选择 三…

土耳其云手机提升TikTok电商效率

在数字化飞速发展的今天,TikTok不仅是一个社交平台,更是一个巨大的电商市场。随着TikTok电商功能在全球范围内的扩展,土耳其的商家和内容创作者正面临着前所未有的机遇。本文将详细介绍土耳其云手机怎样帮助商家抓住机遇,实现业务…

linux/windows wps node.js插件对PPT状态监听并且通知其他应用

需求背景 公司要求对Window系统,和国产操作系统(UOS)的wps 软件在 PPT开始播放 结束播放,和播放中翻页 上一页 下一页 等状态进行监听,并通知到我们桌面应用。 技术方案 开发WPS插件,使用node.JS 插件开…

关于promise的一些例题(运行步骤详细说明)

关于promise的一些例题(详细说明) 基本例题 // 直接运行 输出 1 2 const promise new Promise((resolve, reject) > {console.log(1);resolve();console.log(2); });// then后面放入微队列 promise.then(() > {console.log(3); });// 输出4 之后没有代码了所以运行为队…

数据清洗系统设计

设计一个高效的数据清洗系统旨在确保数据的质量,以便后续分析和决策过程可以基于准确、一致和完整的信息。以下是设计实时数据清洗系统时需要考虑的关键要素,结合之前提到的设计目标和原则: 1. 高效的数据处理 技术选型:采用并行…

vite构建vue3项目hmr生效问题踩坑记录

vite构建vue3项目hmr生效问题踩坑记录 hmr的好处 以下是以表格形式呈现的前端开发中HMR(热模块替换)带来的好处: 好处描述提升开发效率允许开发者在不刷新整个页面的情况下实时更新修改的代码,减少等待时间保持应用状态在模块替…

MES系统具体有哪些功能?如何更高效的利用MES系统

MES系统(Manufacturing Execution System,制造执行系统)是现代制造业中非常重要的一个信息化管理系统,它在生产过程中起到了关键的作用。MES系统的具体功能可以归纳如下: 万界星空科技MES系统的具体功能 生产计划管理…

HarmonyOS入门-状态管理

View(UI):UI渲染,指将build方法内的UI描述和Builder装饰的方法内的UI描述映射到界面。 State:状态,指驱动UI更新的数据。用户通过触发组件的事件方法,改变状态数据。状态数据的改变,引起UI的重新渲染。 装…

FPGA开发——奇数分频器的设计

一、概论 在我们进行FPGA分频器的学习当中,我们通常会学习怎样完成任意分频器的设计,其中就包括偶数分频最为常见。在实现的分频器的同时我们也会不定时的要求同时设置对应的占空比。今天我们就来看看怎样同时设置奇数分频器和其对应50%的占空比。 二、…

oracle读写时相关字符集详解

服务器端操作系统(Oracle linux)字符集 服务器端数据库字符集 客户端操作系统(Oracle linux)字符集 客户端工具sqlplus字符集 结论1:客户端工具sqlplus的会话,使用的字符集,是数据库字符集。…

【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)

为探讨数据科学和计算智能领域的关键问题,促进相关交流,2024年智能计算与数据分析国际学术会议(ICDA 2024)将于2024年9月6日-8日在中国青岛召开。 本届会议拟邀请数据分析和计算智能领域的顶级专家、学者和产业界优秀人才,围绕当前…

数据结构(Java):七大排序算法【详解】

目录 1、排序的概念 1.1 排序 1.2 排序的稳定性 1.3 内部排序&外部排序 1.4 各排序算法总结对比 2、 插入排序 2.1 🌸直接插入排序 2.2 🌸希尔排序 3、 选择排序 3.1 🌸直接选择排序 3.2 直接选择排序优化 3.3 🌸…

[红明谷CTF 2021]write_shell 1

目录 代码审计check()$_GET["action"] ?? "" 解题 代码审计 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){// if(preg_match("/| |_||p…

C语言------指针讲解(3)

一、字符指针 在指针中&#xff0c;我们知道有一类指针类型为字符指针char*; int main() {char ch w;char* pc &ch;*pc w;return 0; } 还有一种使用方式如下&#xff1a; 上述代码中&#xff0c;本质是把hello的首字符的地址放到了pstr中。即把一个常量字符串的首字符…

神经网络处理器模拟器的一点思考

一 神经网络处理器 通常基于FPGA的神经网络处理器进行部署某种网络&#xff0c;考虑的因素较多&#xff0c;具体包括网络模型的不同&#xff0c;涵盖不同的算子、激活函数、调度策略等等&#xff1b;具体硬件实现&#xff0c;涉及神经网络处理器并行度、硬件资源消耗&#xff0…

OpenGL入门第六步:材质

目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,…