Tomcat服务器顶层结构和启动过程

   通过从部署的 1240 个 JVM 中得到的数据,我们能够确定出现了 862 个容器供应商,或者说是占到了运行环境的 70% 左右。这些容器的供应商分布如下:

    

 Tomcat 的安装基数已经连续两年超过排行榜的 50%。占到总份额的 58.22% 无疑使其成为赢家。

 免费、开源、跨平台的Tomcat无疑是我们开始学习Java EE的第一个服务器,会用对于日常开发完全够用了,但是还是要学一下Tomcat相关的原理和设计思想等,对于以后相关的扩展和优化有着重要的作用。

 下边是学习Tomcat,翻看Tomcat源码的一些总结和感悟,作为笔记查看。

 

1、Tomcat服务器顶层结构

          俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解             具体细节。

          Tomcat的结构很复杂,但是Tomcat也非常的模块化,找到了Tomcat最核心的模块,问题才可以游刃而解。

           先上一张Tomcat的顶层结构图,如下:

           

   Tomcat中最顶层的容器是【Server】,代表着整个服务器,从上图中可以看出 

    一个Server可以包含至少一个Service,用于具体提供服务

   Service主要包含两个部分: Connector和Container。从上图中可以看出Tomcat的心脏就是这两个组件,它们的作用如下:

      1、Connector用于处理【连接相关】的事情,并提供【Socket与Request和Response相关的转化】。

      2、Container用于【封装】和【管理Servlet】,以及具体处理Request请求。

 一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提供http和https连接,也可以提供相同协议不同端口的连接。

多个Connecor和一个Container就形成了一个Service,有了Service就可以对外提供服务了,但是Service还要一个生存的环境,必须要有人能够给他生命、掌握其生死大权,那就非Server莫属了。所以整个Tomcat的生命周期由Server控制。

 另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0)

详细的配置文件文件内容可以到Tomcat官网查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html

上边的配置文件,还可以通过下边的一张结构图更清楚的理解:

Server标签设置的端口号为8005,shutdown="SHUTDOWN",表示在8005端口监听"SHUTDOWN"命令,如果接收到了就会关闭Tomcat。

一个Server有一个Service,当然还可以进行配置,一个Service有多个,Service左边的内容都属于Container的,Service下边是Connector。

总结:

   Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container。

 

2、Tomcat的启动过程

         首先看一张Tomcat启动的时序图,如下:

         

    Tomcat的启动入口【main方法】是在【Bootstrap类】里,但具体的执行过程是在Catalina里面,这样做可以使得把启动的入口和具体的管理类进行分开,从而可以方便的创建多种启动的方式。

    Catalina是整个Tomcat的管理类,他有3个方法load、start、stop分别用来管理整个服务器的生命周期。

      1)load方法用于加载tomcat/conf目录下的server.xml配置文件,用来创建Server并调用Server的init方法进行初始化操作

      2)start方法用于启动服务器,在内部调用Server的start方法

      3)stop方法用于停止服务器,在内部调用Server的stop方法

  load方法在内部调用了Server的init方法,这三个方法都会按层次逐层调用相应的方法。

从上述的时序图,按着从上到下,从左到右的顺序,完全可以了解整个Tomcat的启动顺序。

上图中看到了几个陌生的名字,下边具体说明。

2.1、Bootstrap的启动过程

       Bootstrap作为Tomcat的启动入口,其main方法如下:

      

  (1)上述执行的bootstrap.init()方法源代码如下:

    

(2)main方法里边,首先创建一个Bootstrap,并执行init方法进行初始化,然后出来main方法里传入的参数,如果参数为空,默认为start。

(3)在init方法里初始化ClassLoader,并用ClassLoader创建了Catalina实例,然后赋值给catalinaDaemon变量,后边对命令的操作都要使用catalinaDaemon来具体的执行;

(4)在start命令的处理调用的时候有三个方法:setAwait、load 
、start。这三个方法在内部调用了Clatalina的相应的方法进行具体的执行,只不过是用反射来调用的。

2.2、Catalina的启动过程

Catalina的启动主要调用setAwait、load和start方法来实现,setAwait方法用于设置Server启动完成后是否进入等待状态的标志,如果为true则进入,否则不进入;load方法用于加载配置文件,创建并初始化Server;start用于启动服务器。

Catalina的load方法根据con/server.xml文件进行创建对象的,并赋值给server属性。

2.3、Server的启动过程

Server是一个接口,继承自Lifecycle ,接口定义如下:

public interface Server extends Lifecycle {}

看接口的结构图可以看出,其中包含了addService、findService、removeService三个主要的方法,用来增加、查找、删除Service。Server的init方法和start方法分别循环调用了每个Service方init方法和start方法来启动所有的Service。

Server 的默认实现是:org.apache.catalina.core.StandardServer,继承关系图如下:

StandardServer的initInternal和startInternal方法分别循环调用了每一个Service的start和init方法。

2.4、Service的启动过程

Service是一个接口,继承自Lifecycle ,接口定义如下:

public interface Service extends Lifecycle {}

Service 接口定义的方法和属性如下:

Service的默认实现是:org.apache.catalina.core.StandardService。StandardService和StandardServer有相似的继承关系,如下图:

 

StandardService的initInternal方法如下:

StandardService的startInternal方法如下:

可以看出,StandardService的initInternal和startInternal方法主要调用container、executors、mapperListener、connectors的init和start方法。

mapperListener是Mapper的监听器,用来监听Container容器的变化;executors是用在connectors中管理线程的线程池,在server.xml文件中可以看到,默认是注释的:

3、总结

上述的几小节,大致记录了一下Tomcat的整体结构,在上边介绍的时候,也有一些没有写到的东西,比如说Tomcat生命周期管理的接口Lifecycle、Connector、Container以及Tomcat如何进行通信,如何解析和处理具体的Http请求,这些会在以后的学习中不断记录下来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值