tomcat学习随笔

news2024/12/26 23:35:59

Tomcat结构与原理

  • 一、组成
    • Server
      • Service
        • Connector
          • ProtocolHandler
            • Endpoint
            • Processor
          • Adaptor
        • Container
          • Engine
          • Host
          • Context
          • Wrapper
  • 运行
  • 热部署
    • jsp
    • war

tomcat根路径

tomcat根路径目录结构示意图

一、组成

tomcat结构示意图

tomcat结构debug示意图

Server

tomcat的实例,支持多个Service

Service

web服务,主要包含Connector(多个)和Container(一个)

Connector

连接器(支持多个)作用是协议(如http)通信,负责监听端口来接收消息请求,并传递给Container进行业务处理,再将结果响应会客户端。
过程:网络通信- 应用层协议解析-Request/Response与ServeletRequest/ServeletResponse转化

属性含义
protocol监听的协议,默认是HTTP/1.1(7.0:org.apache.coyote.http11.Http11Protocol,8.0:org.apache.coyote.http11.Http11NioProtocol)
port监听的端口号
minThread服务器启动时创建的处理请求的线程数
maxThread最大可以创建的处理请求的线程数
enableLookups为true表示可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名;否则不进行DNS查询,而是返回其ip地址
acceptCount当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout超时的时间数(以毫秒为单位)
redirectPort当前Connector不支持SSL,收到了一个SSL传输请求时重定向的端口号
SSLEnabled是否开启 sll 验证,在Https 访问时需要开启
URIEncodingURL字符编码

更多见源码:org.apache.catalina.connector.Connector

ProtocolHandler

协议处理器,将不同协议和通信方式组合封装。本身就是顶层接口。
举例过程:org.apache.coyote.http11.Http11NioProtocol --> org.apache.tomcat.util.net.AbstractEndpoint(start --> startAcceptorThreads) --> org.apache.coyote.AbstractProtocol

Endpoint

端点,负责socket的接收和发送。顶层抽象类是org.apache.tomcat.util.net.AbstractEndpoint。

Acceptor
AbstractEndpoint子类的内部类,继承AbstractEndpoint的抽象内部类Acceptor,具体逻辑实现不同。
作用就是用于监听 Socket 连接请求。

Handler
AbstractEndpoint子类的内部类,继承AbstractEndpoint的内部接口Handler,供具体ProtocolHandler的内部类包装。
作用就是与Processor交互。

SocketProcessor
AbstractEndpoint子类的内部类,实现Runnable,具体逻辑实现不同。
作用就是通过run方法执行handler与Processor交互。

Processor

处理器,负责构建(填充数据)Request和Response对象

Adaptor

适配器,负责Request/Response与ServeletRequest/ServeletResponse转化。
如org.apache.catalina.connector.CoyoteAdapter

Container

一个Service中仅有一个,负责业务处理。包含Engine、Host、Context、Wrapper
container子类结构

tomcat container子类结构示意图
Engine

引擎,用于处理连接的执行器。一个Service只能配置一个Engine

属性含义
name名称
defaultHost默认的Host虚拟机域名,如localhost

更多见源码:org.apache.catalina.core.StandardEngine

Host

虚拟机,基于域名匹配至指定虚拟机,类似于nginx 当中的server

属性含义
name域名,必须配置,如localhost,至少有一个Host的name与Engine的defaultHost一致
appBase应用的根路径,支持相对路径(相对于tomcat安装目录根目录),默认webapps
unpackWARs是否自动解压war,默认true
autoDeploy是否热部署war:替换到整个Context环境(即包含session之类),默认true

更多见源码:org.apache.catalina.core.StandardHost

Context

应用上下文,隔离各个web应用,一个Context对应一个WebappClassLoader。一个Host下支持配置多个Context

属性含义
docBase应用物理路径,支持相对路径(相对于Host的appBase),默认不配置
path应用上下文路径,默认不配置
reloadable是否热加载class:替换掉WebappClassLoader。正式环境不用,默认false

更多见源码:org.apache.catalina.core.StandardContext

Wrapper
Pipeline结构
org.apache.catalina.core.ContainerBase
	org.apache.catalina.core.StandardPipeline

源码过程
org.apache.tomcat.util.net.AprEndpoint.SocketProcessor#doRun
org.apache.coyote.AbstractProtocol.AbstractConnectionHandler#process
org.apache.coyote.http11.AbstractHttp11Processor#process
// this.adapter.service(this.request, this.response);
	org.apache.catalina.connector.CoyoteAdapter#service
	// this.connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
		org.apache.catalina.core.StandardEngineValve#invoke
		// host.getPipeline().getFirst().invoke(request, response);
			org.apache.catalina.core.StandardContextValve#invoke
			// wrapper.getPipeline().getFirst().invoke(request, response);
				org.apache.catalina.core.StandardWrapperValve#invoke
				// filterChain.doFilter(request.getRequest(), response.getResponse());
					org.apache.catalina.core.ApplicationFilterChain#internalDoFilter
					// this.servlet.service(request, response);
简易流程
EngineValue --> HostValue --> ContextValue --> WrapperValue --> FilterChain --> Servelet

运行

org.apache.catalina.startup.Bootstrap#main

1、初始化
org.apache.catalina.startup.Bootstrap#load
org.apache.catalina.startup.Catalina#load

1.1、加载配置初始化
org.apache.tomcat.util.digester.Digester#parse
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl#scanDocument
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl#scanStartElement
com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser#emptyElement
org.apache.tomcat.util.digester.Digester#startElement
调用各种rule
org.apache.tomcat.util.digester.ObjectCreateRule#begin

realClassName
	org.apache.catalina.core.StandardServer
	org.apache.catalina.core.StandardService
	org.apache.catalina.core.StandardEngine
	org.apache.catalina.core.StandardHost

org.apache.catalina.startup.ConnectorCreateRule#begin

org.apache.catalina.connector.Connector
	# HTTP/1.1。其他协(见org.apache.catalina.connector.Connector#setProtocol)类似
	org.apache.coyote.http11.Http11AprProtocol
		org.apache.tomcat.util.net.AprEndpoint
		org.apache.coyote.http11.Http11AprProtocol.Http11ConnectionHandler(包装Processor

1.2、init方法初始化
org.apache.catalina.core.StandardServer#initInternal
org.apache.catalina.core.StandardService#initInternal
org.apache.catalina.core.StandardEngine#initInternal
org.apache.catalina.connector.Connector#initInternal
org.apache.catalina.mbeans.MBeanFactory#createStandardContext

创建org.apache.catalina.connector.CoyoteAdapter并设置到org.apache.coyote.ProtocolHandler(如org.apache.coyote.http11.Http11AprProtocol|--> org.apache.coyote.AbstractProtocol#init
	|--> org.apache.tomcat.util.net.AbstractEndpoint#init
 		|--> org.apache.tomcat.util.net.AbstractEndpoint#bind(有具体实现类实现,目的就是创建如socket的通信)

2、启动
org.apache.catalina.startup.Bootstrap#start
org.apache.catalina.startup.Catalina#start
org.apache.catalina.core.StandardServer#startInternal
org.apache.catalina.core.StandardService#startInternal
org.apache.catalina.core.StandardEngine#startInternal
org.apache.catalina.connector.Connector#startInternal

|--> org.apache.coyote.AbstractProtocol#start
	|--> org.apache.tomcat.util.net.AbstractEndpoint#start
		|--> 相应的Endpoint实现类的内部Poller类#init + start

tomcat类加载器
三个类加载器

tomcat类加载器debug示意图

破坏双亲委派

tomcat破坏双亲委派debug示意图

热部署

jsp

替换JasperLoader,重新加载类

org.apache.jasper.servlet.JspServletWrapper#service
// this.ctxt.compile();
	// 判断是否做修改,修改则重新生成java和class文件,并设置jspLoader加载器为null,reload标志为true
	org.apache.jasper.JspCompilationContext#compile
	// this.jspLoader = null;
	// this.jspCompiler.compile();
	// this.jsw.setReload(true);
		org.apache.jasper.compiler.Compiler#compile
			org.apache.jasper.compiler.JDTCompiler#generateClass
// servlet = this.getServlet();
	// 如果reload为true,则销毁旧servelet对象(是否卸载相关类取决于GC能够回收)、生成新的对象以及初始化
	org.apache.jasper.servlet.JspServletWrapper#getServlet
	// this.destroy();
	// servlet = (Servlet)instanceManager.newInstance(this.ctxt.getFQCN(), this.ctxt.getJspLoader());
	// servlet.init(this.config);

替换org.apache.catalina.loader.WebappClassLoader,重新加载类
热加载class

org.apache.catalina.core.ContainerBase#backgroundProcess
// loader.backgroundProcess();
	org.apache.catalina.loader.WebappLoader#backgroundProcess
	// this.reloadable && this.modified() 为true就就行reload,其中this.modified() 是遍历了当前应用所有资源是否更改
		org.apache.catalina.core.StandardContext#reload
		// this.stop();
		// this.start();

war

重新初始化Context上下文环境,就是重新启动一个应用(断点过程一直无法执行到)。
代码调试过程,修改war展开后的应用根目录,虽然会被监听到,但因为是目录跳过了后续流程(没有reload、deployed或host存在该应用名称的缓存),相当于不处理(除非删除应用根目录之后再添加) 对war包更新、新增 和 应用移除(war包展开目录)有效
热部署war

org.apache.catalina.core.ContainerBase.ContainerBackgroundProcessor#processChildren
	org.apache.catalina.core.StandardContext#backgroundProcess
		org.apache.catalina.core.ContainerBase#backgroundProcess
			org.apache.catalina.util.LifecycleSupport#fireLifecycleEvent
			// 通过listener来通知
				org.apache.catalina.startup.HostConfig#lifecycleEvent
				// this.check();
					// 判断资源是否更改,更改则同样执行org.apache.catalina.core.StandardContext#reload
					org.apache.catalina.startup.HostConfig#checkResources
					// 条件符合情况下,重新初始化context
					org.apache.catalina.startup.HostConfig#deployApps()
						org.apache.catalina.startup.HostConfig#deployDescriptor

参考 tomcat9调优3:Tomcat类加载机制及其热部署热加载原理剖析

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

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

相关文章

ChatGPT炒股:从股票招股说明书中批量提取竞争对手信息

股票招股说明书中都会提到上市公司的市场竞争情况和竞争对手。要研究企业,就必须仔细研究竞争对手。怎么将竞争对手这些信息批量从招股说明书中提取出来呢? 首先观察其规律: 有的是这样写的: 行业内的主要企业:浙江…

《Python机器学习:基于PyTorch和Scikit-Learn》——AIC松鼠活动第三期

内容简介 本书是一本全面介绍在PyTorch环境下学习机器学习和深度学习的综合指南,可以作为初学者的入门教程,也可以作为读者开发机器学习项目时的参考书。 本书讲解清晰、示例生动,深入介绍了机器学习方法的基础知识,不仅提供了构…

【广州华锐互动】疏通清洗车VR实训教学平台

疏通作业车是一种专门用于城市下水道、排水管道等清理和维护的特种车辆。由于其工作环境复杂,操作难度较大,因此需要专业的培训和技能掌握。为了提高疏通作业车驾驶员的技能水平,VR虚拟仿真技术应运而生。 VR虚拟仿真技术是一种通过计算机模…

记录jeecg-boot及a-table前端问题

标签页重复 原因: 在TabLayout中它有监听$route,是根据route.fullpath去判断的。这就会出现一种情况,我是同一个path比如/detail,但是我带了个参数/detail?id132165151651和/detail?id256151561651这两个fullpath明显不同,所以…

ciscoNAT

静态NAT Router0 int f0/0 ip add 192.168.1.3 255.255.255.0 # 两个PC的网关 no shutdown int f0/1 ip add 202.103.224.1 255.255.255.0 no shutdown exit ip route 0.0.0.0 0.0.0.0 202.103.224.2 # 配置默认路由能够去往目标网络 # 将内部网络的IP地址(192.168.1.1)映射到…

Typora 免费版下载安装(超简单亲测适用于Windows)与入门

前言 Typora大家都知道, 是一款好用的编辑器和阅读器。鬼鬼为大家找了一个可使用版本,安装过程十分简单,亲测有效,不浪费大家时间,现在将Typora分享给大家免费使用。下载链接在文章最后。 目录 前言 一、Typora的介…

前端JavaScript入门-day06

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 作用域 局部作用域 全局作用域 作用域链 JS垃圾回收机制 1. 什么是垃圾回收机制 2.内存的生命周…

链路传播(Propagate)机制及使用场景

服务间链路追踪传播机制是指在微服务架构中,通过记录和跟踪服务之间的请求和响应信息,来实现对服务间链路的追踪和监控。这种机制可以帮助开发人员快速定位服务间出现的问题,并进行优化和调整。 具体来说,服务间链路追踪传播机制…

nvm的简介、安装、使用

一、nvm是什么? .nvm是一个node的版本管理工具,可以简单操作node版本的切换、安装、查看。。。等等,与npm不同的是,npm是依赖包的管理工具。 二、nvm的安装。 点击如下文件进行安装: (1)安装…

超声波功率放大器工作原理是什么意思

超声波功率放大器是一种能够将低功率、小振幅的超声波信号放大至足够高功率和大振幅输出的电子设备。它通常被用于超声波清洗、焊接、切割、医疗等领域中。 超声波功率放大器的工作原理基于声学共振的原理。具体来说,超声波功率放大器由一个压电陶瓷换能器和一个功放…

增强型(RX651)R5F56514EDFP、R5F5651EHDFP、R5F5651CDDBP微控制器,强化工业物联网安全。

RX651 微控制器 (MCU)系列产品,以满足工业自动化、楼宇自动化和智能表计系统更高的安全需求。扩展的微控制器集成了Trusted SecureIP(TSIP),以及用于工业和网络控制系统的增强型可靠闪存功能和人机界面(HMI&#xff0…

C# HTTP Error 500.19

解决办法&#xff1a; .vs configapplicationhost.config 修改<section name"windowsAuthenticationnurununoverrideModeDefault"Allow”/>

QQ消息是如何到达接收方的?看完这个你就明白了

A通过QQ给异地的B发了条消息&#xff0c;直到B收到了消息&#xff0c;中间经历了怎样的过程? 北京的A通过QQ给深圳的B发了一条消息&#xff0c;B在QQ上接收到了消息&#xff0c;从A点击发送开始&#xff0c;到B看到消息结束&#xff0c;中间过程是如何实现的&#xff1f;中间…

.Net Core Restful Api 版本区分第一种

前言&#xff1a;在我们进行Web Api开发时&#xff0c;版本的区分&#xff0c;是必须要考虑的&#xff0c;涉及到我们的版本发布&#xff0c;切换等&#xff0c;如何从旧版本无缝的切换到新版本&#xff1f; 下面&#xff0c;我们通过使用[ApiVersion]特性&#xff0c;实现两个…

超详细的学习笔记:CSS定位装饰(附代码示例)

笔记参考b站网课&#xff1a;【前端开发入门教程&#xff0c;web前端零基础html5 css3前端项目视频教程】https://www.bilibili.com/video/BV1Kg411T7t9?p124&vd_source06e5549bf018e111f4275c259292d0da 目录 一、网页常见布局方式 1、标准流 2、浮动 3、定位 二、定…

软件鉴定测试报告需要哪些材料?

软件鉴定测试报告是对软件产品进行功能、性能和安全等方面的测试和评估后所生成的报告。软件鉴定测试报告作为软件质量的重要指标&#xff0c;为软件的发布和应用提供可靠的依据。以下是软件鉴定测试报告中常见的材料内容&#xff1a; 1. 软件测试计划&#xff1a;包括测试目的…

UncategorizedSQLException 报错

85、UncategorizedSQLException 报错 出现问题的原因&#xff1a; 本身是没有这个问题的&#xff0c;后来服务器上的一张表&#xff0c;被误删了&#xff0c;重新创建之后&#xff0c;就出现了这个问题 org.springframework.jdbc.UncategorizedSQLException: ### Error upd…

C++—类和对象

文章目录 1 类2 对象2.1 创建对象2.2 对象的操作2.3 构造函数2.4 析构函数 3 静态成员4 this指针5 友元 一切我们研究的事物&#xff0c;都可以叫做对象。对象具有状态&#xff0c;操作和行为。通常用一个数值来描述对象的状态。对象的操作用于改变对象的状态。对象和对象的操作…

BlueZ 开发学习指南(一) --- D-Bus介绍

BlueZ 开发学习指南&#xff08;一&#xff09; — D-Bus介绍 一、 BlueZ与D-Bus简介 Linux使用的蓝牙协议栈是Blue Z&#xff0c;不同于我们以往的开发方式&#xff0c;Blue Z提供的API 并不是通过头文件这样的形式&#xff0c; 而是通过D-Bus的方式来提供的。 Blue Z提供的是…

AutoDL 训练stable-diffusion lora模型

1.创建镜像实例 2. 启动实例 3.启动服务 4.配置参数 4.1 基础模型选择 4.2 文件路径设置 5.点击打印训练信息 6.训练模型&#xff08;点击Train model&#xff09;