欢迎来到天天文库
浏览记录
ID:40296812
大小:943.50 KB
页数:36页
时间:2019-07-30
《Tomcat 系统架构与设计模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Tomcat系统架构与设计模式,第1部分:工作原理许令波,Java开发工程师,淘宝网许令波,现就职于淘宝网,是一名Java开发工程师。对大型互联网架构设计颇感兴趣,并对一些开源框架也有比较深入的研究。简介: 这个分为两个部分的系列文章将研究ApacheTomcat的系统架构以及其运用的很多经典设计模式。本文是第1部分,将主要从Tomcat如何分发请求、如何处理多用户同时请求,还有它的多级容器是如何协调工作的角度来分析Tomcat的工作原理,这也是一个Web服务器首要解决的关键问题。标记本文!发布日期: 2010年5月20日级别
2、: 中级访问情况 276次浏览建议: 8 (查看或添加评论)平均分(共42个评分)本文以Tomcat5为基础,也兼顾最新的Tomcat6和Tomcat4。Tomcat的基本设计思路和架构是具有一定连续性的。Tomcat总体结构Tomcat的结构很复杂,但是Tomcat也非常的模块化,找到了Tomcat最核心的模块,您就抓住了Tomcat的“七寸”。下面是Tomcat的总体结构图:图1.Tomcat的总体结构从上图中可以看出Tomcat的心脏是两个组件:Connector和Container,关于这两个组件将在后面详细介绍。Co
3、nnector组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这个组件是如此重要,不仅跟服务器的设计的本身,而且和不同的应用场景也十分相关,所以一个Container可以选择对应多个Connector。多个Connector和一个Container就形成了一个Service,Service的概念大家都很熟悉了,有了Service就可以对外提供服务了,但是Service还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非Server莫属了。所以整个Tomcat的生命周期由Server控制。以Servic
4、e作为“婚姻”我们将Tomcat中Connector、Container作为一个整体比作一对情侣的话,Connector主要负责对外交流,可以比作为Boy,Container主要处理Connector接受的请求,主要是处理内部事务,可以比作为Girl。那么这个Service就是连接这对男女的结婚证了。是Service将它们连接在一起,共同组成一个家庭。当然要组成一个家庭还要很多其它的元素。说白了,Service只是在Connector和Container外面多包一层,把它们组装在一起,向外面提供服务,一个Service可以设置
5、多个Connector,但是只能有一个Container容器。这个Service接口的方法列表如下:图2.Service接口从Service接口中定义的方法中可以看出,它主要是为了关联Connector和Container,同时会初始化它下面的其它组件,注意接口中它并没有规定一定要控制它下面的组件的生命周期。所有组件的生命周期在一个Lifecycle的接口中控制,这里用到了一个重要的设计模式,关于这个接口将在后面介绍。Tomcat中Service接口的标准实现类是StandardService它不仅实现了Service借口同时
6、还实现了Lifecycle接口,这样它就可以控制它下面的组件的生命周期了。StandardService类结构图如下:图3.StandardService的类结构图从上图中可以看出除了Service接口的方法的实现以及控制组件生命周期的Lifecycle接口的实现,还有几个方法是用于在事件监听的方法的实现,不仅是这个Service组件,Tomcat中其它组件也同样有这几个方法,这也是一个典型的设计模式,将在后面介绍。下面看一下StandardService中主要的几个方法实现的代码,下面是setContainer和addCon
7、nector方法的源码:清单1.StandardService.SetContainerpublicvoidsetContainer(Containercontainer){ContaineroldContainer=this.container;if((oldContainer!=null)&&(oldContainerinstanceofEngine))((Engine)oldContainer).setService(null);this.container=container;if((this.container!=n
8、ull)&&(this.containerinstanceofEngine))((Engine)this.container).setService(this);if(started&&(this.container!=null)&&(this.containerinstan
此文档下载收益归作者所有