2019-10-28 17:44  阅读(2918)
文章分类:Tomcat 源码分析 文章标签:TomcatTomcat 源码
©  原文作者:clawhub 原文地址:http://clawhub.club

总体架构

Tomcat的总体架构还是比较清晰的,贴一张图先有个简单的印象,这样在之后分析源码的时候能减少懵的概率。

202105291433176351.png

Tomcat总体结构.png

一个服务器的基本功能:接收客户请求,解析请求,处理业务逻辑,结果返回给客户端。
一般有两个方法,star打开服务,监听端口;stop关闭服务,释放资源。
Tomcat也是一样的,只不过更复杂,功能更完善。
为什么Tomcat要分为这么多的组件呢?原因很简单:为了扩展。好像所有的多组件架构都是为了好扩展。
Connector负责请求监听,Container负责请求处理。server.xml配置了Connector与Container的对应关系,Service就包含了这种对应关系。
在Tomcat架构中,一个Server包含多个Service,每个Service包含多个Connector与一个Container,Container又有4种实现:Engine、
Host、ontext、Wrapper。

server.xml配置文件

用Tomcat肯定会接触到配置文件server.xml。从配置文件中也能看出来大概的架构。

    

组件

从架构图中看到了好多组件,其实并不知道它的作用是什么,这里简单的介绍一下。

1 Server

Server是Tomcat的最上层容器,代表着Tomcat服务。在源码中用org.apache.catalina.Server抽象出来,其实现类org.apache.catalina.core.StandardServer的继承关系图如下:

202105291433181702.png

Server.png

这里先看一眼LifecycleMBeanBase抽象类。

2 Service

一个Server包含多个Service,多个Service共享JVM。上面也简单说到Service封装了多个Connector与一个Container,从配置文件中也可以看出来。
在源码中org.apache.catalina.Service的标准实现是:org.apache.catalina.core.StandardService,它的类继承关系图为:

202105291433184123.png

Service.png

这里再看一眼LifecycleMBeanBase抽象类。

3 Connector

Connector的作用就是连接器,接收客户端的请求,交给Container处理,之后Container将处理后的结果返回给Connector,再由Connector返回给客户端。
每个Connector都会监听独立的端口,以用来处理客户端请求。上面配置文件中有两个。
Tomcat源码中org.apache.catalina.connector.Connector类的继承关系图:

202105291433186014.png

Connector.png

这里再再看一眼LifecycleMBeanBase抽象类。

4 Container

Tomcat中Container的架构如下:

202105291433188275.png

Container.png

每个组件都代表不同的处理逻辑:
Engine代表最外层的处理逻辑容器,整个Sevlet引擎,也是和Connector绑定的组件。
Host代表虚拟主机,一个Engine可以包含多个虚拟主机。
Context代表应用,一个虚拟主机可以有多个应用。
Wrapper代表Sevlet,一个应用中有多个Wrapper。

在Tomcat源码中,org.apache.catalina.Container接口的继承接口:
org.apache.catalina.Engine、org.apache.catalina.Host、org.apache.catalina.Context、org.apache.catalina.Wrapper
抽象了上述概念。下面分别简单介绍一下:

4.1 Engine

Engine是容器的最顶层,表示Catalina的Servlet引擎。org.apache.catalina.Engine的标准实现:org.apache.catalina.core.StandardEngine
的类继承关系图:

202105291433190576.png

Engine.png

这里再再再看一眼LifecycleMBeanBase抽象类。

4.2 Host

Host代表虚拟主机,即可以部署应用。在源码中org.apache.catalina.Host的标准实现org.apache.catalina.core.StandardHost的类继承关系图:

202105291433193257.png

Host.png

这里再再再再看一眼LifecycleMBeanBase抽象类。

4.3 Context

Context代表着Web应用,org.apache.catalina.Context的标准实现类org.apache.catalina.core.StandardContext的类继承关系:

202105291433195808.png

Context.png

这里依然再再再再再看一眼LifecycleMBeanBase抽象类。

4.3 Wrapper

Wrapper代表Servlet,org.apache.catalina.Wrapper的标准实现org.apache.catalina.core.StandardWrapper的类继承图:

202105291433198619.png

Wrapper.png

这里再再再再再再看一眼LifecycleMBeanBase抽象类。

LifecycleMBeanBase

上面出现了那么多看一眼LifecycleMBeanBase抽象类,只是为了加深一下印象,可以看出Tomcat的所有组件的标准实现,
都直接或间接继承了它,可想而知其有多么的重要。

LifecycleMBeanBase的类关系图:

2021052914332014610.png

LifecycleMBeanBase.png

  • MBeanRegistration:
    JmxEnabled的父类, jmx框架提供的注册MBean的接口,引入此接口是为了便于使用JMX提供的管理功能。
  • Lifecycle:
    生命周期的管理,通过上面的图可以看出使用了大量的模板模式,Tomcat组件的init,start,stop,destory最终都会调用到各个组件实现的钩子方法。

在这再多一嘴,说说LifecycleListener与LifecycleEvent和Lifecycle的关系:使用了观察者模式,
Lifecycle是一个监听者,会向观察者LifecycleListener发送各种LifecycleEvent事件。

至此已经基本上了解了Tomcat的整体架构,这会帮我我们更好的分析源码。


来源:https://www.jianshu.com/u/9632919f32c3

点赞(2)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Tomcat源码分析【二】总体架构
上一篇
Tomcat源码分析【一】版本选择与工程导入
下一篇
Tomcat源码分析【三】分析方向选择