背景

Tomcat 是一款开源轻量级 Web 应用服务器,是一款优秀的 Servlet 容器实现。不管在之前War包打天下,还是现在的分布式、集群、虚拟容器化等相当成熟的阶段,主流的JAVA服务容器领域,它的地位都不可轻易被替代。对Tomcat停留在使用层面,难免在服务优化和配置的选型等方面存在误区和遇到一些坑,那么对其源码和设计思路的了解就相当有必要了。


Tomcat的源码有很多,今天我们就来重点分析一下启动流程设计、生命周期组件、容器及管道机制。选用的源码版本为目前的主流稳定版8.5;

启动架构设计

我们在启动Tomcat服务的时候,通常去运行的是安装目录的bin路径下startup(.sh/bat)?脚本,其实打开它的源码就会看到里面会调用catalina(.sh/.bat)这个启动脚本,而这个脚本最终运行到Tomcat启动类Bootstrap.class。在Bootstrap中首先会进行类加载器定义和类加载(下次详细介绍),然后进行server.xml解析、进而初始化各个部件,最后才是顺序运行各个部件、后台任务处理线程和事件监听等。

管道机制

在一个比较复杂的大型系统中,如果一个对象或数据流需要进行繁杂的逻辑处理,我们可以选择在一个大的组件中直接处理这些繁杂的业务逻辑, 这个方式虽然达到目的,但扩展性和可重用性较差, 因为可能牵一发而动全身。更好的解决方案是采用管道机制,用一条管道把多个对象(阀门部件)连接起来,整体看起来就像若干个阀门嵌套在管道中一样,而处理逻辑放在阀门上。

总结

Tomcat源码中精妙之处远不止这种优秀的整体设计与机制(当然学习优秀的源码,我认为主要是学习它的整体设计思路)。但很多实现的环节也用到并发编程的相关技术,我认为同样也可圈可点,如线程池、异步任务、可重入锁、读写锁、阻塞队列、写时复制容器、原子类等,当然也综合运用了其他的设计模式如访问者、适配器等。推荐大家有时间可多读一下!