深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

08 | Tomcat的“高层们”都负责做什么?

处理请求
启动连接器
启动Mapper监听器
启动Engine
启动Socket监听停止端口
管理Service组件
关闭钩子
处理异常情况
创建Server
初始化Tomcat的类加载器
Engine组件
Service组件
Server组件
Catalina
Bootstrap
Tomcat启动过程
Tomcat的“高层们”都负责做什么?

该思维导图由 AI 生成,仅供参考

使用过 Tomcat 的同学都知道,我们可以通过 Tomcat 的/bin目录下的脚本startup.sh来启动 Tomcat,那你是否知道我们执行了这个脚本后发生了什么呢?你可以通过下面这张流程图来了解一下。
1.Tomcat 本质上是一个 Java 程序,因此startup.sh脚本会启动一个 JVM 来运行 Tomcat 的启动类 Bootstrap。
2.Bootstrap 的主要任务是初始化 Tomcat 的类加载器,并且创建 Catalina。关于 Tomcat 为什么需要自己的类加载器,我会在专栏后面详细介绍。
3.Catalina 是一个启动类,它通过解析server.xml、创建相应的组件,并调用 Server 的 start 方法。
4.Server 组件的职责就是管理 Service 组件,它会负责调用 Service 的 start 方法。
5.Service 组件的职责就是管理连接器和顶层容器 Engine,因此它会调用连接器和 Engine 的 start 方法。
这样 Tomcat 的启动就算完成了。下面我来详细介绍一下上面这个启动过程中提到的几个非常关键的启动类和组件。
你可以把 Bootstrap 看作是上帝,它初始化了类加载器,也就是创造万物的工具。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入解析了Tomcat启动过程中涉及的关键组件和类的功能和实现细节。通过类比的方式将Tomcat的启动类和组件比作公司中的管理层,形象地解释了它们的职责和关系。详细介绍了Catalina、Server和Service组件的实现细节,包括它们的启动流程、异常处理和资源清理等方面。文章还涉及了Tomcat的“关闭钩子”和热部署支持的相关内容。通过对这些“高层”组件的实现细节的解析,读者可以逐步理解Tomcat的工作原理,并学习到管理型组件的实现方法。整体而言,本文以清晰的逻辑和生动的类比,深入解析了Tomcat的“高层”组件,为读者提供了深入了解Tomcat内部工作原理的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(45)

  • 最新
  • 精选
  • 大卫
    老师好,tomcat一般生产环境线程数大小建议怎么设置呢

    作者回复: 理论上: 线程数=((线程阻塞时间 + 线程忙绿时间) / 线程忙碌时间) * cpu核数 如果线程始终不阻塞,一直忙碌,会一直占用一个CPU核,因此可以直接设置 线程数=CPU核数。 但是现实中线程可能会被阻塞,比如等待IO。因此根据上面的公式确定线程数。 那怎么确定线程的忙碌时间和阻塞时间?要经过压测,在代码中埋点统计,专栏后面的调优环节会涉及到。

    2019-06-05
    2
    37
  • Geek_ebda96
    老师最近遇到一个问题,刚到新公司,看他们把一个tomact的connector的线程池设置成800,这个太夸张了吧,connector的线程池只是用来处理接收的http请求,线程池不会用来处理其他业务本身的事情,设置再大也只能提高请求的并发,并不能提高系统的响应,让这个线程池干其他的事情,而且线程数太高,线程上下文切换时间也高,反而会降低系统的响应速度吧?我理解是不是对的,老师?还有一个问题就是设置的connector线程数,是tomcat启动的时候就会初始化这么多固定的线程还是这只是一个上限,还有就是如果线程处于空闲状态,会不会进行上下文切换呢?

    作者回复: 这里你误解了Connector中的线程池,这个线程池就是用来处理业务的。另外你提到线程数设的太高,会有线程切换的开销,这是对的。线程数具体设多少,根据具体业务而定,如果你的业务是IO密集型的,比如大量线程等待在数据库读写上,线程数应该设的越高。如果是CPU密集型,完全没有阻塞,设成CPU核数就行。800这个数有点高,我猜你们的应用属于IO密集型。

    2019-06-05
    5
    33
  • yang
    老师,我看的慢。 一个子容器只有一个父容器, 如 a的父容器是容器b; 那此时,只有父容器会调用子容器的start()方法吧? 如果用synchronized同步互斥的方法保护调用子容器的start()方法,会不会有些多余?

    作者回复: 如果在嵌入式启动,不能预测用户的行为,可能不小心起了两个线程来启动同一个Server 实例,防范于未然,再说启动阶段加个保险也没多大开销,一次性的。

    2019-06-11
    2
    21
  • 识度℃
    有个常见问题请教一下,在实际应用场景中,tomcat在shutdown的时候,无法杀死java进程,还得kill,这是为何呢?

    作者回复: Tomcat会调用Web应用的代码来处理请求,可能Web应用代码阻塞在某个地方。

    2019-05-29
    2
    20
  • allean
    如果映射关系不变,而是某个具体的Servlet的方法处理逻辑变了,热部署也可以解决重启tomcat的尴尬吗

    作者回复: 那不叫热部署,叫热加载。 热部署和热加载都不需要重启Tomcat。

    2019-05-28
    19
  • calljson
    热部署和热加载原理帮忙讲解下,还有强制停止比如杀进程等,怎么通过钩子处理的?

    作者回复: 热部署和热加载有专门的一篇详细解释,简单来说就是Tomcat启动了后台线程监控项目文件的变化,一旦变了就重新加载整个应用或个别Java类。 kill -9 强杀的话,JVM钩子也没办法执行到。

    2019-05-28
    18
  • 一道阳光
    老师,1.catalina创建组件,是把所有的对象都new出来了吧,只是各个组件之间没有相互注入吧。 2.为什么catalina直接调用server的start方法?不是先init吗? 3.容器之间是什么时候注入进去的?还有listener是什么时候注入到组件中去的?

    作者回复: 1,对的,直接new出来 2,start方法里调了init方法 3,父容器应该是在构造函数里new了子容器

    2019-06-04
    9
  • wwm
    老师,请教一个问题: 在Bootstrap中,基于什么原因用反射的方式创建Catalina实例,之后继续基于反射方式调用load、init、start这些方法?为什么不是直接new Catalina实例后通过实例直接调用这些方法?

    作者回复: Tomcat有自己的类加载器体系,Catalina相关的类都是由 专门的类加载器catalinaLoader来加载: Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina") Tomcat的类加载器体系会有专门的文章来详细解释。

    2019-05-28
    9
  • 易儿易
    李老师,您在给Geek_ebda96同学回复问题的时候指出“Connector中的线程池就是用来处理业务的”,这个业务指的是什么呢?从第05节讲ProtocolHandler组件的图中可以看出,这个线程池位于EndPoint与Processor之间用于处理接收到的Socket请求并调用Proessor,并没有直接处理业务呀……

    作者回复: Processor线程会调用你的业务代码

    2019-06-30
    6
  • 发条橙子 。
    老师,对于你的问题,实际上我也不理解为何要加锁 。 首先,按理说server对每一个service开一个线程去初始化 。 应该不会多个线程对一个service同时初始化吧。 再者,这块同步如果是要防止重复初始化,那应该在start()方法中做,否则等释放锁后,下一个线程获得锁还是会执行start()方法。 所以这块加锁具体的作用我也看不懂,难道是起到多线程同步阻塞的作用??

    作者回复: 不管外面怎么调,加了锁这个方法就是线程安全的了

    2019-05-29
    2
    6
收起评论
显示
设置
留言
45
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部