zoukankan      html  css  js  c++  java
  • Tomcat的结构

    Tomcat其实就是一个容器,最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务。Service主要包含两部分:Connector和Container。一个Service只有一个Container,但可以有多个Connectors(因为一个服务可以有多个连接,如同时有提供http和https连接,也可以提供相同协议不同端口的连接)。Catalina是整个Tomcat的管理类,它里面有三个方法load、start、stop分别用来管理整个服务器的生命周期,load方法用于根据conf/server.xml文件创建Server并调用Server的init方法进行初始化,start方法用于启动服务器,stop方法用于停止服务器,start和stop方法在内部分别调用了Server的start和stop方法,load方法内部调用了Server的init方法,这三个方法都会按容器的结构逐层调用相应的方法,比如,Server的start方法中会调用所有Service中的start方法,Service中的start方法又会调用所有包含的Connectors和Container的start方法,这样整个服务器就启动了,init和stop方法也是一样的,这就是Tomcat生命周期的管理方式。Catalina还有一个很重要的方法await,直接调用Server的await方法,这个方法的作用是进入一个循环,让主线程不会退出。Tomcat的main方法并不在Catalina类里,而是在Bootstrap中,这样做的好处是可以把启动的入口和具体的管理类分开,从而可以很方便地创建出多种启动方式。

    Lifecycle接口用来管理生命周期,所有的生命周期组件都要实现该接口。一个做了4件事情:

    1. 定义了LifecycleEvent事件的type属性
    2. 定义了三个管理监听器的方法addLifecycleListener、findLifecycleListeners和removeLifecycleListener
    3. 定义了4个生命周期的方法:init、start、stop和destroy,用于执行生命周期的各个阶段的操作
    4. 定义了获取当前状态的两个方法:getState和getStateName

    Container用于封装和管理Servlet,以及具体 处理request请求。

    Container是Tomcat中容器的接口,通常使用的Servlet就封装在其子接口Wrapper中。Container一共有4个子接口Engine、Host、Context、Wrapper和一个默认实现 的ContainerBase,每一个子接口都是一个容器,这4个子容器都有一个对应的StandardXXX实现类,并且这些实现类都继承ContainerBase类。另外Container还继承Lifecycle接口,而且ContainerBase间接继承LifecycleBase,所以Engine、Host、Context、Wrapper都符合Tomcat的生命周期管理模式。

    Container的子容器Engine、Host、Context、Wrapper是逐层包含的关系,其中Engine是最顶层,每个Service最多只能有一个Engine,Engine里面可以有多个Host,每个Host下可以有多个Context,每个Context下可以有多个Wrapper。

    • Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine。
    • Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点。
    • Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件。
    • Wrapper:每个Wrapper封装着一个Servlet。

    Pipeline-Value管道

    Container处理请求是使用Pipeline-Value管道来处理的,采用的是责任链模式实现的,但有稍微的不同:

    1. 每个Pipeline都有特定的Value,而且是在管道的最后一个执行,这个Value叫BaseValue,BaseValue是不可以删除的
    2. 在上层容器的管道的BaseValue中会调用下层容器的管道。

    Connector用于处理连接相关的事情,并提供Socket与request、response的转换。

    Connector是用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,ProtocolHandler里面有3个非常重要的组件:Endpoint、Processor和Adapter。Endpoint用于处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将封装好的Request交给Container进行具体处理。也就是说Endpoint用来实现TCP/IP协议,Processor用来实现HTTP协议,Adapter将请求适配到Servelet容器进行具体处理。

    • Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步request的超时,Handler用于处理接收到的Socket,在内部调用了Processor进行处理
    • Processor的porcess方法中会调用Adapter的service方法来处理请求。
    • Adapter的service方法主要是调用Container管道中的invoke方法来处理请求。
  • 相关阅读:
    每周分享五个 PyCharm 使用技巧(一)
    深入理解 Python 中的上下文管理器
    Delphi中Chrome Chromium、Cef3学习笔记(四)
    DELPHI中自定义消息的发送和接收
    Delphi2010/XE2下隐藏程序系统任务栏的图标
    批处理经典入门教程!(从不懂到高手)第2/5页
    批处理经典入门教程!(从不懂到高手)1/5
    批处理taskkill运行结束不掉程序以及停留问题
    delphi EncdDecd.pas单元中Encoding方法出现#$D#$A的解决方法
    Delphi中Chrome Chromium、Cef3学习笔记(三)
  • 原文地址:https://www.cnblogs.com/pinxiong/p/6398341.html
Copyright © 2011-2022 走看看