粗浅看 Tomcat系统架构分析

Tomcat的结构很复杂,但是Tomcat也非常的模块化,找到了Tomcat最核心的模块,就抓住了Tomcat七寸

整体结构

Tomcat 总体结构图


从上图中可以看出Tomcat的心脏是两个组件:Connector Container,关于这两个组件将在后面详细介绍。Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这个组件是如此重要,不仅跟服务器的设计的本身,而且和不同的应用场景也十分相关,所以一个Container 可以选择对应多个Connector多个Connector和一个Container 就形成了一个ServiceService 的概念大家都很熟悉了,有了Service 就可以对外提供服务了,但是Service还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非Server莫属了。所以整个Tomcat的生命周期由Server控制。

以Service  作为“婚姻”

我们将 Tomcat ConnectorContainer 作为一个整体比作一对情 侣的话,Connector 主要负责对外交流,可以比作为 BoyContainer 主要处理 Connector 接受的请求,主要是处理内部事务,可以比作Girl那么这个 Service就是连接这对男女的结婚证了。是Service将它们连接在一起,共同组成一个家庭。当然要组成一个家庭还要很多其它的元素。

说白了,Service 只是在Connector Container外面多包一层,把它们组装在一起,向外面提供服务,一个Service可以设置多个Connector但是只能有一个 Container 容器。这个 Service 口的 方法列表如下:

①Service接口


Service接口中定义的方法中可以看出,它主要是为了关联ConnectorContainer,同时会初始化它下面的其它组件,注意接 口中它并没有规定一定要控制它下面的组件的生命周期。所有组件的 生命周期在一个 Lifecycle 接口中控制,这里用到了一个重要的设 计模式,关于这个接口将在后面介绍。

Tomcat Service接口的标准实现类是StandardService它不仅实现了 Service 借口同时还实现了 Lifecycle 接口,这样它就可以控 制它下面的组件的生命周期了。StandardService 类结构图如下:

②StandardService的类结构图


从上图中可以看出除了 Service接口的方法的实现以及控制组件生命周期的 Lifecycle 口的实现,还有几个方法是用于在事件监听的 方法的实现,不仅是这个 Service 组件Tomcat 其它组件也同样 有这几个方法,这也是一个典型的设计模式,将在后面介绍。

下面看一StandardService 中主要的几个方法实现的代码,下面是setContaineraddConnector 方法的源码:

StandardService. SetContainer

public void setContainer(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(this);

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++)

connectors[i].setContainer(this.container);

}

if (started && (oldContainer != null) && (oldContainer instanceof Lifecycle)) {

try {

((Lifecycle)  oldContainer).stop();

} catch (LifecycleException e) {

;

}

}

support.firePropertyChange("container", oldContainer, this.container);
—————————————————————————————
}

这段代码很简单,其实就是先判断当前的这个 Service 没有已经关 联了 Container,如果已经关联了,那么去掉这个关联关系——oldContainer.setService(null)。如果这个 oldContainer 已经被启动 了,结束它的生命周期。然后再替换新的关联、再初始化并开始这个新的 Container 的生命周期。最后将这个过程通知感兴趣的事件监听程序。这里值得注意的地方就是,修改Container 时要将新的 Container关联到每个Connector

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值