Tomcat总体架构和启动流程
Tomcat大家都知道,这个没什么好描述的,我们先看Tomcat的总体架构
1、总体架构
架构一步一步增加组件,先来个最原始的
===

Server:Tomcat的整体服务,负责接收和处理请求。其拥有生命周期start开启和stop关闭方法。
但是很明显,所有操作放到Server里面来是不可能的,我们继续往下扩展
===

除开Server还加入了Connector、Container。
Connector连接器:使用Socket来接收请求的到来,并对请求进行响应。
Container容器:用来接收具体的请求,进行处理。
引入后流程就是这样了,Connector接受请求后让Container进行处理,然后再返回给用户
但是这个也有问题,缺少请求之间的映射规则。
===

一个Server下多个Service,一个Service下维护多个Connector和Container,那么此时每个Connector只能给指定的Container处理请求。
这里Container意为容器,我们更改其名称为Engine引擎。
下面我们再将Engine往下细分。
===

这里新加入 了 Context。
Context:代表一个Web应用,那么我们肯定可以有多个的Context
然后我们再往下细化。
5

这里我们需要将域名抽象为虚拟主机,所以定义了Host。
再细分
===

我们一个Wrapper则为一个Servlet。
我们上面将Container去掉了,其实我们这里可以把Engine、Host、Context、Wrapper都堪称Container的子类。
===

图里面组件都同属于同一个生命周期类Lifecycle。

2、启动流程与源码解析
Tomcat启动流程分为两大步:load和start
启动类名为:BootStrap,在我们tomcat的bin中startup命令中,其实就是启动的BootStrap这个类的main方法。
位置:org.apache.catalina.startup.Bootstrap#main

首先是创建BootStra实例,然后调用init方法,并将实例赋值给daemon。

然后进入到下面的方法中,首先是进入deamon(bootstrap)的load方法中。
然后我们进入Bootstrap的load方法中去:

注意这里会去调用catalinaDaemon的load方法,这里是catalinaDaemon为Catalina(org.apache.catalina.startup.Catalina)。

注意在我们Catalina的load方法中。会去获取到Server,此Server为StandardServer,然后去调用其init方法。

注意此处叨到达了我们生命周期父类的init方法中,因为我们的StandardServer并未实现init方法,而是使用initInternal方法,所以我们进入StandardServer的initInternal方法。

注意在StandardServer中,它要开始去调用获取到的多个Service,并挨个初始化,注意我们前面架构图中说了,一个Server是多个Service的。
这里只有一个Service,其为StandardService,这里和Server一样,会去调用生命周期父类的init方法,然后我们进入StandardService的initInternal方法。

这里首先是初始化Engine,其为StandardEngine,里面没有其他操作,这里就不列出来。
然后就是初始化Executor线程池。
然后初始化Connector连接器。注意这里面还有其它初始化的操作,进入其中init方法。

注意这里的protocolHandler是协议处理器,当前这个类的名称叫做Http11NioProtocol,其代表HTTP1.1,NIO代表运行模式,还有bio,nio,nio2,apr这几种模式。
进入Http11NioProtocol的父类的init方法中。

EndPoint为NioEndPoint,其是实现了IO多路复用的组件,其这里不过多解释。
至此BootStrap的load方法结束,我们继续看它的start方法。

其进如Catania的start方法中。

其Catania中进入StandardServer的start方法中,其父类会调用StandardServer的startInternal方法。

可以看到这里面会去执行StandardService的start方法。

依次执行StandardEngine、Executor、Connector的start方法。
然后我们看Connector的startInternal方法。

在进入NioEndPoint父类AbstractEndpoint中start方法,再进入其NioEndPoint的startInternal方法。最后总体架构中所有组件已经完成初始化。
其实这里面还应该有HOST、Wrapper等的初始化操作的,其存在于start方法当中,这个比较复杂后续写上记录。
最后附上时序图:

Tomcat总体架构和启动流程的更多相关文章
- 理解Tomcat架构、启动流程及其性能优化
		PS:but, it's bullshit ! 备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html ... 
- Tomcat架构解析(一)-----Tomcat总体架构
		Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server 1.最简单的服务器结构 最简单的服务器结构如图所示: ... 
- tomcat总体架构
		Tomcat 总体结构图 从上图中可以看出Tomcat的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍.Connector 组件是可以被替换,这样可以提供给 ... 
- Tomcat 第二篇:启动流程
		1 Tomcat 基本知识 首先介绍一些 Tomcat 的基本知识,防止有纯小白看的云里雾里的. 下面这张图是一个下载好二进制版的的 Tomcat ,直接解压得到的,虽然版本是 9.x ,但是这个目录 ... 
- Android系统架构及启动流程
- Tomcat 第三篇:总体架构设计
		Tomcat 总体架构设计 在开始这篇文章的时候,忽然发现上一篇内容的题目不是很合适,不应该叫启动流程,更确切的应该是叫启动脚本. 在最开始,先介绍下 Tomcat 的总体设计,先有一个大概的印象,对 ... 
- Tomcat源码解析-整体流程介绍
		一.架构 下面谈谈我对Tomcat架构的理解 总体架构: 1.面向组件架构 2.基于JMX 3.事件侦听 1)面向组件架构 tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成 ... 
- 步步深入MySQL:架构->查询执行流程->SQL解析顺序!
		一.前言 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序 ... 
- Phalcon Framework的MVC结构及启动流程分析
		目前的项目中选择了Phalcon Framework作为未来一段时间的核心框架.技术选型的原因会单开一篇Blog另说,本次优先对Phalcon的MVC架构与启动流程进行分析说明,如有遗漏还望指出. P ... 
- Tomcat启动流程简析
		Tomcat是一款我们平时开发过程中最常用到的Servlet容器.本系列博客会记录Tomcat的整体架构.主要组件.IO线程模型.请求在Tomcat内部的流转过程以及一些Tomcat调优的相关知识. ... 
随机推荐
- Arrays.sort()降序排序
			默认的Java.util包中的Arrays.sort(),可以实现对java中的基本数据类型(byte.char.short.int.long.float.double.boolean)的数组进行升序 ... 
- 查询dockerhub中某镜像所有版本
			curl https://registry.hub.docker.com/v1/repositories/${imagename}/tags | tr -d '[[]" ]' | tr '} ... 
- ISTQB软件测试初级认证模拟题
			参考地址 http://www.docin.com/p-297467364.html 第一章:软件测试基础(18%) 1.学习目标 1.1 为什么需要软件测试? (K2) ① 通过具体的例子,来描述软 ... 
- Finance财务软件(辅助核算专题)
			支持辅助核算和数量核算 
- vue- cube-scroll踩坑记
			坑: 下拉刷新,上拉加载一直处于加载中 --- 原因:未结束此次下拉或上拉 ---解决:forceUpdate()结束上拉或下拉 无法正常滚动 --- 原因:数据更新了,但页面高度未变化 -- ... 
- 用简单的代码,将小程序文件直传到腾讯云COS实践
			简介 本文介绍如何不依赖 SDK,用简单的代码,在小程序直传文件到腾讯云COS的存储桶. 注意: 本文档内容基于 XML 版本的 API. 前期条件 登录 对象存储控制台 ,创建存储桶,设置 Buck ... 
- 小米手机MIUI安装APK时自动获取安装权限(自动点击权限框)
			这篇主要是记录一下在完全没学过Android的情况下硬拗完的这个APK,拖了很久查了很多资料才勉强写完,比较垃圾但还是实现功能了.记录的过程我也尽量把知识点贴出来. 一开始是看了一个大佬的分享贴( ... 
- 2022-3-15内部群每日三题-清辉PMP
			1.一家公司被一家大公司收购,这家大公司希望把重点放在其核心产品和服务上.处于规划阶段的所有项目都正在进行修定,以包含新的变更管理程序.一个项目的项目经理需要持续的高级输入,以确保与新的组织结构保持一 ... 
- DEV GridControl 主从表 (层次表)
			DataTable dtData= DbHelperOra.Query(strSql2.ToString()).Tables[0]; //主表 dtusers.TableName = "病人 ... 
- 备份是个好习惯  bugku
			题目描述: 解题思路: 1.查看网页源码只显示一行字符,有点像16进制,但经过解码并不是,也不是base64等编码 2.根据题目,应该和备份相关,默认页面一般都是 index.php或者index ... 
