Tomcat6.0源码学习--架构概述
2013-11-14 11:27
441 查看
Tomcat6.0源码学习--架构概述
Tomcat6是最新版本的web容器,其支持最新版本的servlet2.5和jsp2.1。而且Tomcat6架构也是经过重新设计优化过的,所以我们有必要分析一下它的架构过程。显然,这是一个通过阅读Tomcat的源代码及相关文档,演绎架构的过程。或许有人会说,这不是放马后炮吗?!!但我觉得这是自我进步的一个必经步骤,先模仿之,然后才能超越之,毕竟我本凡人。Tomcat的架构总的来说是分层次的、可插拔的组件架构。分层次是指构成Tomcat的组件不是同一级别的,上层组件可以包含子组件,各个组件有其功能范围,当一个组件停止服务时,不会影响上层组件的服务。可插拔是指对于组件的添加和删除并不影响服务器的运行。那么为了达到可插拔的组件架构,分层次的组件架构必成为基础。
对于任何服务器,即使最简单的实现,从面向对象设计(OOD)的角度来说,我们都有必要将“服务器”这个概念抽象出来,为什么呢?因为只有有了这个概念,才能谈服务器的实例,服务器的功能等等其它概念,此之谓“皮之不存,毛将焉附”。赶巧(其实是我的想法恰好撞上人家的想法),Tomcat也将“服务器”抽象为java接口org.apache.catalina.Server,显然Server应该就是最最顶层的组件了。
有了Server这个抽象,很自然的,我们希望它能够提供对servlet和jsp支持的功能。但是我们发现这个概念太大了,我们还需再细化。所以别急,我们还有一些事情要解决。服务器要提供服务就必须能够启动,当然也应该能够停止吧,也就是说服务器应该是有生命的,在启动时初始化必要的资源,而在停止时将其其销毁掉。好吧,我们把这个也抽象出来,叫做生命周期接口,tomcat 实现为org.apache.catalina.Lifecycle.如上所述我们知道Lifecycle需要完成的工作了。
public void start() throws LifecycleException; public void stop() throws LifecycleException; |
Ok,到此,我们分析构建的简单服务器模型出来了,Server由Connector组件和Container组件结合提供web服务。
![](http://img.bimg.126.net/photo/aBDgAJBbE4uXS1UXY19afA==/2572399812159404230.jpg)
图2
有了这个模型后,要实现一个简单的Server已经很简单了,但是在实现Container时,我们还是要做很多事情,如当来请求,我们怎么知道该请求对应得虚拟主机,以及请求的那个应用,应该交给那个servlet对象来处理?这样看来,Container还是太大了,需要细化。根据Servlet规范,我们知道,servlet属于某个应用,且有上下文环境,Container要根据应用上下文环境初始化servlet,然后根据servlet映射调用servlet的service方法。在这里“应用上下文环境”的概念很重要,Tomcat将其抽象为org.apache.catalina.Context,Context继承了Container接口。对于虚拟主机,Tomcat将其抽象为org.apache.catalina.Host,Host继承了Container接口。
好了,有了这些概念,我们再回顾一下请求的处理过程:浏览器发出请求,Connector接受请求,将请求交由Container处理,Container查找请求对应的Host并将请求传递给它,Host拿到请求后查找相应的应用上下文环境,准备servlet环境并调用service方法。
现在,我们的服务器模型变成了如图3所示了。
![](http://img.bimg.126.net/photo/ZhAMeYBkzK21Z6wGTFkLyg==/2572399812159404271.jpg)
图3
但是在Tomcat的实现体系中还有一个Engine的接口,Engine也继承了Container接口,那么这个接口什么用呢?设计Engine的目的有俩个目的,一,当希望使用拦截器查看(过滤或预处理)每个请求时,Engine是个很好的拦截点。二,当希望多个虚拟Host共享一个Http的Connector时,Engine是个很好的门面。所以,Engine接口是作为顶级Container组件来设计的,其作用相当于一个Container的门面。有了Engine,请求的处理过程变为:浏览器发出请求,Connector接受请求,将请求交由Container(这里是Engine)处理,Container(Engine来担当)查找请求对应的Host并将请求传递给它,Host拿到请求后查找相应的应用上下文环境,准备servlet环境并调用service方法。再看看服务器的模型,如图4.
![](http://img.bimg.126.net/photo/sWOAnyquH3-CizHe7VyKvA==/2572399812159404318.jpg)
图4
到目前,我们碰到的组件类型有Connector和Container,其实,这也就是Tomcat的核心组件。如图4,一组Connector和一个Container有机的组合在一起构成Server,就可以提供服务了,对于Tomcat来说,主要是提供Servlet服务,那么也就是说Tomcat服务器也可以提供其它服务了?是的,Tomcat将“一组Connector和一个Container有机的组合”抽象为“服务”接口org.apache.catalina.Service,然而,这些服务实例彼此独立,仅仅共享JVM的基础设施,如系统类路径。
进一步的,我们得到了服务器的框架模型,如图5.
![](http://img.bimg.126.net/photo/pwkVsCdNwDaaxOwpemrixQ==/2572399812159404375.jpg)
图5
由图5,我们知道,对于Tomcat服务器来说,除了Server代表它自己以外,其它组件都是功能组件,都有其职责范围。Service为最顶层的组件,可以添加Connector和Container组件。Engine是Container的最顶层组件,可以添加Host组件,但不能添加父组件。Host组件的父组件是Engine,Host下面包含有Context组件。
接下来看看标准的Tomcat体系结构,如图6.
![](http://img.bimg.126.net/photo/Ut6RJ6_O4Hqg7CcmHlLZow==/4549761523551810338.jpg)
图6
比较图5和图6.我们发现,还有很多辅助组件没有抽象出来。当然,随着需求的一步步加深,我的分析也会一步步深入,这些个组件也会慢慢浮出水面。
您可能也喜欢:
How Tomcat Works中文版--介绍
Tomcat6.0源码学习--Connector架构
Tomcat6.0源码学习--接受并传递请求
Tomcat6.0源码学习--启动框架
Tomcat6.0源码学习--架构分析序
Tomcat6.X SSL的配置-Part1
J2EE的MVC体系结构及其设计模式
扩展Tomcat支持OSGi应用服务(3)
Tomcat6.0源码学习-构建Eclipse源码工程
扩展Tomcat支持OSGi应用服务(1)
Tomcat类加载机制
How Tomcat Works中文版--第2章:简单Servlet容器
相关文章推荐
- Tomcat6.0源码学习--架构概述
- Tomcat6.0源码学习--架构概述
- Tomcat6.0源码学习--架构概述
- Tomcat6.0源码学习--Connector架构
- Tomcat6.0源码学习--Connector架构
- Tomcat6.0源码学习
- Tomcat6.0源码学习--接受并传递请求
- Tomcat6.0源码学习
- Tomcat6.0源码学习--启动框架
- Tomcat6.0源码学习--启动框架
- Tomcat6.0源码学习--接受并传递请求
- (六)Tomcat源码解析 - Tomcat 系统架构与设计模式(二)-设计模式分析
- 深入学习Tomcat----自己动手写服务器(附服务器源码)
- tomcat源码学习一
- Tomcat学习--源码导入和运行
- tomcat 源码学习
- Tomcat学习之Tomcat架构
- tomcat架构分析(valve源码导读)
- 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构
- TLD(Tracking-Learning-Detection)算法学习与源码解析(一)之算法概述