前言
tomcat源码系列的博客终于完成了,老实说比我预计的要快,善始总要善终,最后发一篇总结算是结束这个系列的博客吧。
总结
这个tomcat源码解读的系列博客,完成的进度比我想像的要快很多,实际上,也是因为我并没有对每个细节都很详细的讨论和分析,个人觉得也不需要,因为那会导致篇幅很长,而且,对于真正愿意跟着博客去读源码的人,没必要每个细节都分析,而对于不愿意自己去读源码的人,就算全部详细的分析了,估计也看不下去,所以就干脆以一个抛砖引玉的方式,把总的流程和大的概念给分享出来,希望能对大家有一些帮助吧。
这次读tomcat的源码,其实忽略了不少东西,每个地方其实都能单独成章节来讨论,比如:
- tomcat的监听器
- tomcat的全局命名资源
- tomcat的管道和阀门
- tomcat的连接器扩展
- tomcat的配置解析
等等,这里想想不如我们简单的介绍一下,让有兴趣的读者自行研究吧。
tomcat的监听器
tomcat的监听器,其实在server.xml中我们可以看到很多监听器配置:
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
当然这里我们还能开发自己的监听器,比如tomcat的jmx扩展,就是采用监听器支持我们远程监控tomcat的运行情况的。
tomcat的全局命名资源
在server.xml中,可以使用这个配置:
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
这里定义的是tomcat的全局命名资源,这种资源对象一般在应用中通过JNDI访问,是属于各个应用中通用的资源对象,最好理解的应该就是连接池了,当然多数情况下我们会选择每个应用有单独的连接池,不过在某些数据库连接数有比较严格限制的场景中,多个应用共用一个连接池可以极大的提高连接池的使用效率。
tomcat的管道和阀门
我们已经知道,tomcat接收请求之后,在转发到真正的应用之前,是使用管道来传递请求和响应对象的,这两个对象会在管道中经过每一个阀门,而阀门我们可以在server.xml中配置:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="${catalina.base}/logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
这个是tomcat提供的访问日志阀门,其实我们还能开发自己的阀门,只要实现org.apache.catalina.Valve
接口,然后在server.xml中配置即可。
tomcat的连接器扩展
我们已经知道,tomcat中连接器组件是用来支撑service和外部应用通讯的组件,tomcat默认提供了几种协议的连接器,但是实际上我们也可以定义自己的协议和连接器,然后和我们自己的应用进行通讯,这样甚至可以让我们的应用不复合web应用的标准接口,让tomcat不单单运行webapp。
当然,连接器的配置依然是在server.xml中:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
tomcat的配置解析
在这个系列的博客中,其实我们也没有提到tomcat如何解析server.xml文件并且构造出各个对象的,实际上由于tomcat使用sax的方式解析xml,因此源码读起来相对比较抽象,有兴趣的同学可以专门去研究一下这一部分的内容,估计也可以写一篇篇幅不短的博客。
结束
好吧,tomcat的系列博客到此就结束了吧,未来继续努力。