zoukankan      html  css  js  c++  java
  • Tomcat总体架构和启动流程

    Tomcat大家都知道,这个没什么好描述的,我们先看Tomcat的总体架构

    1、总体架构

    架构一步一步增加组件,先来个最原始的

    ===

    Server:Tomcat的整体服务,负责接收和处理请求。其拥有生命周期start开启和stop关闭方法。

    但是很明显,所有操作放到Server里面来是不可能的,我们继续往下扩展

    ===

    除开Server还加入了Connector、Container。

    Connector连接器:使用Socket来接收请求的到来,并对请求进行响应。

    Container容器:用来接收具体的请求,进行处理。

    引入后流程就是这样了,Connector接受请求后让Container进行处理,然后再返回给用户

    但是这个也有问题,缺少请求之间的映射规则。

    ===

    一个Server下多个Service,一个Service下维护多个Connector和Container,那么此时每个Connector只能给指定的Container处理请求。

    这里Container意为容器,我们更改其名称为Engine引擎。

    下面我们再将Engine往下细分。

    ===

    这里新加入 了 Context。

    Context:代表一个Web应用,那么我们肯定可以有多个的Context

    然后我们再往下细化。

    5

    这里我们需要将域名抽象为虚拟主机,所以定义了Host。

    再细分

    ===

    我们一个Wrapper则为一个Servlet。

    我们上面将Container去掉了,其实我们这里可以把Engine、Host、Context、Wrapper都堪称Container的子类。

    ===

    图里面组件都同属于同一个生命周期类Lifecycle。

    2、启动流程与源码解析

    Tomcat启动流程分为两大步:load和start

    启动类名为:BootStrap,在我们tomcat的bin中startup命令中,其实就是启动的BootStrap这个类的main方法。

    位置:org.apache.catalina.startup.Bootstrap#main

    首先是创建BootStra实例,然后调用init方法,并将实例赋值给daemon。

    然后进入到下面的方法中,首先是进入deamon(bootstrap)的load方法中。

    然后我们进入Bootstrap的load方法中去:

    注意这里会去调用catalinaDaemon的load方法,这里是catalinaDaemon为Catalina(org.apache.catalina.startup.Catalina)。

    注意在我们Catalina的load方法中。会去获取到Server,此Server为StandardServer,然后去调用其init方法。

    注意此处叨到达了我们生命周期父类的init方法中,因为我们的StandardServer并未实现init方法,而是使用initInternal方法,所以我们进入StandardServer的initInternal方法。

    注意在StandardServer中,它要开始去调用获取到的多个Service,并挨个初始化,注意我们前面架构图中说了,一个Server是多个Service的。

    这里只有一个Service,其为StandardService,这里和Server一样,会去调用生命周期父类的init方法,然后我们进入StandardService的initInternal方法。

    这里首先是初始化Engine,其为StandardEngine,里面没有其他操作,这里就不列出来。

    然后就是初始化Executor线程池。

    然后初始化Connector连接器。注意这里面还有其它初始化的操作,进入其中init方法。

    注意这里的protocolHandler是协议处理器,当前这个类的名称叫做Http11NioProtocol,其代表HTTP1.1,NIO代表运行模式,还有bio,nio,nio2,apr这几种模式。

    进入Http11NioProtocol的父类的init方法中。

    EndPoint为NioEndPoint,其是实现了IO多路复用的组件,其这里不过多解释。

    至此BootStrap的load方法结束,我们继续看它的start方法。

    其进如Catania的start方法中。

    其Catania中进入StandardServer的start方法中,其父类会调用StandardServer的startInternal方法。

    可以看到这里面会去执行StandardService的start方法。

    依次执行StandardEngine、Executor、Connector的start方法。

    然后我们看Connector的startInternal方法。

    在进入NioEndPoint父类AbstractEndpoint中start方法,再进入其NioEndPoint的startInternal方法。最后总体架构中所有组件已经完成初始化。

    其实这里面还应该有HOST、Wrapper等的初始化操作的,其存在于start方法当中,这个比较复杂后续写上记录。

    最后附上时序图:

  • 相关阅读:
    Kubernetes滚动更新介绍及使用-minReadySeconds
    Office 365 – SharePoint 2013 Online 与Office相关的应用
    Office 365 – SharePoint 2013 Online 中添加域和域名
    Office 365
    Office 365 – SharePoint 2013 Online 之WebPart开发、部署教程
    Office 365
    Office 365
    信仰坚持!程序员也有春天!
    SharePoint 2013 日历重叠功能简介
    SharePoint 2013 使用 PowerShell 更新用户
  • 原文地址:https://www.cnblogs.com/daihang2366/p/15479065.html
Copyright © 2011-2022 走看看