Tomcat原理系列之一:整体架构,抓住主线
Tomcat原理系列之一:整体架构,抓住主线
- Tomcat整体架构与重要组件
- 1.Tomcat整体架构
- 2.Tomcat重要组件
- 3.Tomcat生活场景类比
- 4.Tomcat层次结构的本质
- Tomcat的主线
- 1.main()方法入口
- 2.三条主线
- 3.时序图
作为一个web容器,请求在服务端的第一站,理解tomcat对我们今后理解spring,理解springmvc等等很多框架都有很大的帮助。
Tomcat整体架构与重要组件
1.Tomcat整体架构
如果你浏览过Tomcat源码相关文章,你一定对此图不陌生.
2.Tomcat重要组件
- Server代表服务器,一个Tomcat只有一个Server
- Service 代表服务: 一个Server可以对外提供多个服务
- Connector连接器: service服务的核心组成之一,主要是链接客户端请求
- Container容器:service服务的核心组成之一,主要是执行业务逻辑,这里按层级为Engine、Host、Context
3.Tomcat生活场景类比
我们可以举个生活场景来理解tomcat
工商局(Tomcat)
- 工商局大楼(Server服务器)
- 办证服务台(Service),缴税服务台(Service) 等等。工商局提供多种服务能力
- 办证服务台有N个工作人员(Connector)接待客户.
- 办证服务台后面那个屋子(Container)里面是幕后工作人员,处理各种流程中的任务
这样理解起来是否清晰呢?
4.Tomcat层次结构的本质
Tomcat的这种层次结构在代码层面是如何体现的呢?
答:上层持有下层对象的引用,即下层作为上层的一个属性存在.
例如:Server组件里面持有 service的引用Service[] services = new Service[0]
public final class StandardServer extends LifecycleMBeanBase implements Server {private static final Log log = LogFactory.getLog(StandardServer.class);private Context globalNamingContext = null;private NamingResourcesImpl globalNamingResources = null;private final NamingContextListener namingContextListener;private int port = 8005;private String address = "localhost";private Random random = null;private Service[] services = new Service[0]; //Server 持有Service的数组....}
为了维护这个关系:需要做什么?
需要在创建每层对象的时候也要把他的下层对象设置到自己属性上。
如何维护这个关系
Tomcat将这种关系维护在server.xml配置文件中。
Tomcat内部使用了Digster工具将这种关系解析出来。
维护这个关系带来哪些便利
因为有这种层级关系,所有tomcat在启动,初始化的时候, 只需要启动或者初始化最顶层的组件,就能将整个tomcat启动起来。
Tomcat的主线
1.main()方法入口
即使像Tomcat这样大的架构,也逃不出main()作为入口的规范.
正如上面所说:我们只需要执行顶层的启动方法就能层级调用将整个tomcat启动起来
Tomcat的启动主要干了3件事,load(),init(),start()抓住这3条主线。我们就基本上了解了Tomcat整个架构的原理
main方法所在类是Bootstrap.class中,从名字我们也可以得知,这是一个启动工具类,这个类也是三条主线的入口。Boostrap在内部会通过反射实例化处一个Catalina类
Catalina类是真正开始三条主线的位置。
public final class Bootstrap {public static void main(String[] args) {if (daemon == null) {Bootstrap bootstrap = new Bootstrap();try {bootstrap.init();//通过反射实例化出Catalina对象} catch (Throwable var3) {handleThrowable(var3);var3.printStackTrace();return;}daemon = bootstrap;} else {Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);}try {String command = "start"daemon.setAwait(true);daemon.load(args);//依次调用Catalina的load(),getServer().init()daemon.start();//调用Catalina的start()方法}}
2.三条主线
- Catalina.load():Catalina的load()方法,使用Digstet工具解析server.xml配置文件,通过解析创建每层组件对象; 并把下层对象设置到上层。(强力建议去搜索Digster理解下)
- Server().init(): 调用每层的init()方法,初始化每层组件的属性等。包含Server,Service,Connector,Engine,Host,Context
- Catalina.start(): 调用每层的start()方法,启动每层的容器,监听等
3.时序图
基于三条主线,画出了相关时序图。加深印象
建议配合时序图,源码,跟一下Tomcat源码这样。会对Tomcat整个原理有很深的理解。
(时序图不是最完美的,但是我对流程的理解。人人都可以对照tomcat源码画出一个属于自己的时序图,如有不足请指出)
图1:load()与init()时序图
图2start()时序图
Tomcat原理系列之一:整体架构,抓住主线相关推荐
- Tomcat原理系列之四:Tomat如何启动spring(加载web.xml)
Tomcat原理系列之四:Tomat如何启动spring 熟悉的web.xml ContextLoaderListener Tomcat的初始化StandardContext.startInterna ...
- tomcat + spring mvc 原理(一):tomcat原理综述和静态架构
tomcat + spring mvc 原理(一):tomcat原理综述和静态架构 tomcat + spring mvc的运作模式 tomcat内部的基本容器构成 tomcat容器对应的外部配置 t ...
- tomcat中间件的默认端口号_死磕Tomcat系列(1)——整体架构
点击上方"Java技术前线",选择"置顶或者星标" 与你一起成长 在许多的高端开发的岗位中都会或多或少有要求面试人员要研究过一些常用中间件源码.这是因为一切的秘 ...
- Dubbo源码分析系列之-整体架构设计
导语: 在了解一个框架的源码的时候,第一步要了解的就是源码的结构,接下来第二步需要了解的就是源码的架构,下面这张图在Dubbo官网上所展示的Dubbo的架构设计图.接下来就来详细的分析一下这张图. ...
- 编程内功心法「底层原理系列」 底层架构原理,分析CPU处理器鲜为人知的那些秘密
前提概要 所谓,知彼知己百战不殆,针对于计算机的优化技术来讲,最底层也不过是针对于CPU技术的优化了,但是如果要区优化程序,涉及到CPU的执行能力,那必须要了解CPU的原理和概念以及执行过程等概念,所 ...
- TensorFlow2.0.0_课时6-18_原理解读与整体架构
概述 机器学习流程 数据获取 特征工程(重点)深度学习解决了这一点,可以自动提取特征 建立模型 评估与应用 深度学习:图像,文本应用最多 数据规模大,万,百万级 图片RGB三维 越暗值越小,越亮值越大 ...
- 学习 launch-editor 源码整体架构,探究 vue-devtools「在编辑器中打开组件」功能实现原理...
1. 前言 你好,我是若川[1],微信搜索「若川视野」关注我,专注前端技术分享,一个愿景是帮助5年内前端开阔视野走向前列的公众号.欢迎加我微信ruochuan12,长期交流学习. 这是学习源码整体架构 ...
- 学习 redux 源码整体架构,深入理解 redux 及其中间件原理
如果觉得内容不错,可以设为星标置顶我的公众号 1. 前言 你好,我是若川.这是学习源码整体架构系列第八篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是 ...
- 学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理
前言 这是学习源码整体架构系列第七篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现.本篇文章学习的是实际仓库的代码. 学习源码整体 ...
- DM 源码阅读系列文章(二)整体架构介绍
2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结 ...
最新文章
- WPF的二维绘图(二)——几何图形Geometry
- OpenCV | OpenCV哈里斯 (Harris)角点检测
- 特征值与特征向量的几何含义(转)
- pycharm 如何通过VCS快速提交代码?
- Python函数——.strip()
- memcached安装运行
- 15.IDA-查看XREF列表
- mysql文件查看工具_OpenDBViewer
- LeetCode 541. 反转字符串 II
- LS-GAN:把GAN建立在Lipschitz密度上
- minimum_should_match参数
- noob学python #1
- prisma使用mongodb副本集群报错引发的一些列问题
- 个人网页、博客、课程--不断更新
- php ean13,php生成EAN_13标准条形码实例_PHP教程
- ndk开发流程,9次Android面试经验总结,已拿offer入职
- 密码字典大全(seclists)
- python循环爬取页面_使用for或while循环来处理处理不确定页数的网页数据爬取
- 安装CP2102驱动2021
- 迟到两年的求职总结经验分享