tomcat 系统架构与设计模式_许令波

上传人:小** 文档编号:87402339 上传时间:2019-04-04 格式:DOC 页数:32 大小:880.50KB
返回 下载 相关 举报
tomcat 系统架构与设计模式_许令波_第1页
第1页 / 共32页
tomcat 系统架构与设计模式_许令波_第2页
第2页 / 共32页
tomcat 系统架构与设计模式_许令波_第3页
第3页 / 共32页
tomcat 系统架构与设计模式_许令波_第4页
第4页 / 共32页
tomcat 系统架构与设计模式_许令波_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《tomcat 系统架构与设计模式_许令波》由会员分享,可在线阅读,更多相关《tomcat 系统架构与设计模式_许令波(32页珍藏版)》请在金锄头文库上搜索。

1、第 1 部分: 工作原理本文以 Tomcat 5 为基础,也兼顾最新的 Tomcat 6 和 Tomcat 4。Tomcat 的基本设计思路和架构是具有一定连续性的。Tomcat 总体结构Tomcat 的结构很复杂,但是 Tomcat 也非常的模块化,找到了 Tomcat 最核心的模块,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的总体结构图:图 1.Tomcat 的总体结构从上图中可以看出 Tomcat 的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍。Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为

2、这个组件是如此重要,不仅跟服务器的设计的本身,而且和不同的应用场景也十分相关,所以一个 Container 可以选择对应多个 Connector。多个 Connector 和一个 Container 就形成了一个 Service,Service 的概念大家都很熟悉了,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。以 Service 作为“婚姻”我们将 Tomcat 中 Connector、Container 作为一个整体比作一对

3、情侣的话,Connector 主要负责对外交流,可以比作为 Boy,Container 主要处理 Connector 接受的请求,主要是处理内部事务,可以比作为 Girl。那么这个 Service 就是连接这对男女的结婚证了。是 Service 将它们连接在一起,共同组成一个家庭。当然要组成一个家庭还要很多其它的元素。说白了,Service 只是在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 Service 可以设置多个 Connector,但是只能有一个 Container 容器。这个 Service 接口的方法列表如下:图 2. Ser

4、vice 接口从 Service 接口中定义的方法中可以看出,它主要是为了关联 Connector 和 Container,同时会初始化它下面的其它组件,注意接口中它并没有规定一定要控制它下面的组件的生命周期。所有组件的生命周期在一个 Lifecycle 的接口中控制,这里用到了一个重要的设计模式,关于这个接口将在后面介绍。Tomcat 中 Service 接口的标准实现类是 StandardService 它不仅实现了 Service 借口同时还实现了 Lifecycle 接口,这样它就可以控制它下面的组件的生命周期了。StandardService 类结构图如下:图 3. Standard

5、Service 的类结构图从上图中可以看出除了 Service 接口的方法的实现以及控制组件生命周期的 Lifecycle 接口的实现,还有几个方法是用于在事件监听的方法的实现,不仅是这个 Service 组件,Tomcat 中其它组件也同样有这几个方法,这也是一个典型的设计模式,将在后面介绍。下面看一下 StandardService 中主要的几个方法实现的代码,下面是 setContainer 和 addConnector 方法的源码:清单 1. StandardService. SetContainerpublic void setContainer(Container containe

6、r) 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(this); if (started & (thi

7、s.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 != null) & (oldContainer insta

8、nceof Lifecycle) try (Lifecycle) oldContainer).stop(); catch (LifecycleException e) ; support.firePropertyChange(container, oldContainer, this.container);这段代码很简单,其实就是先判断当前的这个 Service 有没有已经关联了 Container,如果已经关联了,那么去掉这个关联关系 oldContainer.setService(null)。如果这个 oldContainer 已经被启动了,结束它的生命周期。然后再替换新的关联、再初始化并

9、开始这个新的 Container 的生命周期。最后将这个过程通知感兴趣的事件监听程序。这里值得注意的地方就是,修改 Container 时要将新的 Container 关联到每个 Connector,还好 Container 和 Connector 没有双向关联,不然这个关联关系将会很难维护。清单 2. StandardService. addConnectorpublic void addConnector(Connector connector) synchronized (connectors) connector.setContainer(this.container); connec

10、tor.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) e.printStackTrace(System

11、.err); if (started & (connector instanceof Lifecycle) try (Lifecycle) connector).start(); catch (LifecycleException e) ; support.firePropertyChange(connector, null, connector); 上面是 addConnector 方法,这个方法也很简单,首先是设置关联关系,然后是初始化工作,开始新的生命周期。这里值得一提的是,注意 Connector 用的是数组而不是 List 集合,这个从性能角度考虑可以理解,有趣的是这里用了数组但是并

12、没有向我们平常那样,一开始就分配一个固定大小的数组,它这里的实现机制是:重新创建一个当前大小的数组对象,然后将原来的数组对象 copy 到新的数组中,这种方式实现了类似的动态数组的功能,这种实现方式,值得我们以后拿来借鉴。最新的 Tomcat6 中 StandardService 也基本没有变化,但是从 Tomcat5 开始 Service、Server 和容器类都继承了 MBeanRegistration 接口,Mbeans 的管理更加合理。以 Server 为“居”前面说一对情侣因为 Service 而成为一对夫妻,有了能够组成一个家庭的基本条件,但是它们还要有个实体的家,这是它们在社会上

13、生存之本,有了家它们就可以安心的为人民服务了,一起为社会创造财富。Server 要完成的任务很简单,就是要能够提供一个接口让其它程序能够访问到这个 Service 集合、同时要维护它所包含的所有 Service 的生命周期,包括如何初始化、如何结束服务、如何找到别人要访问的 Service。还有其它的一些次要的任务,如您住在这个地方要向当地政府去登记啊、可能还有要配合当地公安机关日常的安全检查什么的。Server 的类结构图如下:图 4. Server 的类结构图它的标准实现类 StandardServer 实现了上面这些方法,同时也实现了 Lifecycle、MbeanRegistratio

14、n 两个接口的所有方法,下面主要看一下 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, services.length); resultsservices.length = service; services = results; if (initialized)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号