Tomcat 系统架构与设计模式.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Tomcat 系统架构与设计模式.doc》由会员分享,可在线阅读,更多相关《Tomcat 系统架构与设计模式.doc(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Tomcat 系统架构与设计模式,第 1 部分: 工作原理许 令波, Java 开发工程师, 淘宝网许令波,现就职于淘宝网,是一名 Java 开发工程师。对大型互联网架构设计颇感兴趣,并对一些开源框架也有比较深入的研究。简介:这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式。本文是第 1 部分,将主要从 Tomcat 如何分发请求、如何处理多用户同时请求,还有它的多级容器是如何协调工作的角度来分析 Tomcat 的工作原理,这也是一个 Web 服务器首要解决的关键问题。标记本文!发布日期:2010 年 5 月 20 日 级别:中级 访问情况2
2、76 次浏览 建议:8(查看或添加评论) 平均分 (共 42 个评分 )本文以 Tomcat 5 为基础,也兼顾最新的 Tomcat 6 和 Tomcat 4。Tomcat 的基本设计思路和架构是具有一定连续性的。Tomcat 总体结构Tomcat 的结构很复杂,但是 Tomcat 也非常的模块化,找到了 Tomcat 最核心的模块,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的总体结构图:图 1.Tomcat 的总体结构从上图中可以看出 Tomcat 的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍。Connector 组件是可以被
3、替换,这样可以提供给服务器设计者更多的选择,因为这个组件是如此重要,不仅跟服务器的设计的本身,而且和不同的应用场景也十分相关,所以一个 Container 可以选择对应多个 Connector。多个 Connector 和一个 Container 就形成了一个 Service,Service 的概念大家都很熟悉了,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。以 Service 作为“婚姻”我们将 Tomcat 中 Connec
4、tor、Container 作为一个整体比作一对情侣的话,Connector 主要负责对外交流,可以比作为 Boy,Container 主要处理 Connector 接受的请求,主要是处理内部事务,可以比作为 Girl。那么这个 Service 就是连接这对男女的结婚证了。是 Service 将它们连接在一起,共同组成一个家庭。当然要组成一个家庭还要很多其它的元素。说白了,Service 只是在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 Service 可以设置多个 Connector,但是只能有一个 Container 容器。这个 Se
5、rvice 接口的方法列表如下:图 2. Service 接口从 Service 接口中定义的方法中可以看出,它主要是为了关联 Connector 和 Container,同时会初始化它下面的其它组件,注意接口中它并没有规定一定要控制它下面的组件的生命周期。所有组件的生命周期在一个 Lifecycle 的接口中控制,这里用到了一个重要的设计模式,关于这个接口将在后面介绍。Tomcat 中 Service 接口的标准实现类是 StandardService 它不仅实现了 Service 借口同时还实现了 Lifecycle 接口,这样它就可以控制它下面的组件的生命周期了。StandardServ
6、ice 类结构图如下:图 3. StandardService 的类结构图从上图中可以看出除了 Service 接口的方法的实现以及控制组件生命周期的 Lifecycle 接口的实现,还有几个方法是用于在事件监听的方法的实现,不仅是这个 Service 组件,Tomcat 中其它组件也同样有这几个方法,这也是一个典型的设计模式,将在后面介绍。下面看一下 StandardService 中主要的几个方法实现的代码,下面是 setContainer 和 addConnector 方法的源码:清单 1. StandardService. SetContainerpublic void setCont
7、ainer(Container container) Container oldContainer = this.container; if (oldContainer != null) & (oldContainer instanceof Engine) (Engine) oldContainer).setService(null); this.container = container; if (this.container != null) & (this.container instanceof Engine) (Engine) this.container).setService(t
8、his); if (started & (this.container != null) & (this.container instanceof Lifecycle) try (Lifecycle) this.container).start(); catch (LifecycleException e) ; synchronized (connectors) for (int i = 0; i connectors.length; i+) connectorsi.setContainer(this.container); if (started & (oldContainer != nul
9、l) & (oldContainer instanceof Lifecycle) try (Lifecycle) oldContainer).stop(); catch (LifecycleException e) ; support.firePropertyChange(container, oldContainer, this.container);这段代码很简单,其实就是先判断当前的这个 Service 有没有已经关联了 Container,如果已经关联了,那么去掉这个关联关系 oldContainer.setService(null)。如果这个 oldContainer 已经被启动了,
10、结束它的生命周期。然后再替换新的关联、再初始化并开始这个新的 Container 的生命周期。最后将这个过程通知感兴趣的事件监听程序。这里值得注意的地方就是,修改 Container 时要将新的 Container 关联到每个 Connector,还好 Container 和 Connector 没有双向关联,不然这个关联关系将会很难维护。清单 2. StandardService. addConnectorpublic void addConnector(Connector connector) synchronized (connectors) connector.setContainer
11、(this.container); connector.setService(this); Connector results = new Connectorconnectors.length + 1; System.arraycopy(connectors, 0, results, 0, connectors.length); resultsconnectors.length = connector; connectors = results; if (initialized) try connector.initialize(); catch (LifecycleException e)
12、e.printStackTrace(System.err); if (started & (connector instanceof Lifecycle) try (Lifecycle) connector).start(); catch (LifecycleException e) ; support.firePropertyChange(connector, null, connector); 上面是 addConnector 方法,这个方法也很简单,首先是设置关联关系,然后是初始化工作,开始新的生命周期。这里值得一提的是,注意 Connector 用的是数组而不是 List 集合,这个从
13、性能角度考虑可以理解,有趣的是这里用了数组但是并没有向我们平常那样,一开始就分配一个固定大小的数组,它这里的实现机制是:重新创建一个当前大小的数组对象,然后将原来的数组对象 copy 到新的数组中,这种方式实现了类似的动态数组的功能,这种实现方式,值得我们以后拿来借鉴。最新的 Tomcat6 中 StandardService 也基本没有变化,但是从 Tomcat5 开始 Service、Server 和容器类都继承了 MBeanRegistration 接口,Mbeans 的管理更加合理。以 Server 为“居”前面说一对情侣因为 Service 而成为一对夫妻,有了能够组成一个家庭的基本
14、条件,但是它们还要有个实体的家,这是它们在社会上生存之本,有了家它们就可以安心的为人民服务了,一起为社会创造财富。Server 要完成的任务很简单,就是要能够提供一个接口让其它程序能够访问到这个 Service 集合、同时要维护它所包含的所有 Service 的生命周期,包括如何初始化、如何结束服务、如何找到别人要访问的 Service。还有其它的一些次要的任务,如您住在这个地方要向当地政府去登记啊、可能还有要配合当地公安机关日常的安全检查什么的。Server 的类结构图如下:图 4. Server 的类结构图它的标准实现类 StandardServer 实现了上面这些方法,同时也实现了 Li
15、fecycle、MbeanRegistration 两个接口的所有方法,下面主要看一下 StandardServer 重要的一个方法 addService 的实现:清单 3. StandardServer.addServicepublic void addService(Service service) service.setServer(this); synchronized (services) Service results = new Serviceservices.length + 1; System.arraycopy(services, 0, results, 0, servic
16、es.length); resultsservices.length = service; services = results; if (initialized) try service.initialize(); catch (LifecycleException e) e.printStackTrace(System.err); if (started & (service instanceof Lifecycle) try (Lifecycle) service).start(); catch (LifecycleException e) ; support.firePropertyC
17、hange(service, null, service); 从上面第一句就知道了 Service 和 Server 是相互关联的,Server 也是和 Service 管理 Connector 一样管理它,也是将 Service 放在一个数组中,后面部分的代码也是管理这个新加进来的 Service 的生命周期。Tomcat6 中也是没有什么变化的。组件的生命线“Lifecycle”前面一直在说 Service 和 Server 管理它下面组件的生命周期,那它们是如何管理的呢?Tomcat 中组件的生命周期是通过 Lifecycle 接口来控制的,组件只要继承这个接口并实现其中的方法就可以统一
18、被拥有它的组件控制了,这样一层一层的直到一个最高级的组件就可以控制 Tomcat 中所有组件的生命周期,这个最高的组件就是 Server,而控制 Server 的是 Startup,也就是您启动和关闭 Tomcat。下面是 Lifecycle 接口的类结构图:图 5. Lifecycle 类结构图除了控制生命周期的 Start 和 Stop 方法外还有一个监听机制,在生命周期开始和结束的时候做一些额外的操作。这个机制在其它的框架中也被使用,如在 Spring 中。关于这个设计模式会在后面介绍。Lifecycle 接口的方法的实现都在其它组件中,就像前面中说的,组件的生命周期由包含它的父组件控制
19、,所以它的 Start 方法自然就是调用它下面的组件的 Start 方法,Stop 方法也是一样。如在 Server 中 Start 方法就会调用 Service 组件的 Start 方法,Server 的 Start 方法代码如下:清单 4. StandardServer.Startpublic void start() throws LifecycleException if (started) log.debug(sm.getString(standardServer.start.started); return; lifecycle.fireLifecycleEvent(BEFORE_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Tomcat 系统架构与设计模式 系统 架构 设计 模式
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内