• Tomcat整体架构分析


    本篇博客主要介绍下Tomcat整体架构,以及核心组件的作用。

    1. 整体架构简析

    如果将Tomca他的结构高度抽象的话,那么Tomcat其实可以看成只是有连接器(Connector)和容器(Container)两个组件构成。其中Connector组件负责在服务器端处理客户端连接,包括接收客户端连接、接收客户端的消息报文以及消息报文的解析等工作,而Container组件则负责对客户端的请求进行逻辑处理,并把结果返回给客户端。Container组件其实可以再细分,分成Engine组件、Host组件、Context组件和Wrapper组件。

    从Tomcat服务器配置文件server.xml的内容格式看,它所描述的Tomcat也符合上图的层级结构,以下便是server.xml简洁的配置节点,所以从server.xml文件也能看出Tomcat的大体结构:

    <? xml version='1.0' encoding='utf-8'? >
    <Server>
        <Listener/>
        <GlobalNamingResources>
        <Resource/>
        </GlobalNamingResources>
        <Service>
            <Executor/>
            <Connector/>
            <Engine>
                <Cluster/>
                <Realm/>
                <Host>
                <Context/>
                </Host>
            </Engine>
        </Service>
    </Server>
    

    2. Server组件

    Server是最顶级的组件,它代表Tomcat的运行实例,在一个JVM中只会包含一个Server。在Server的整个生命周期中,不同阶段会有不同的事情要完成。为了方便扩展,它引入了监听器方式,所以它也包含了Listener组件。另外,为了方便在Tomcat中集成JNDI,引入了GlobalNamingResources组件。同时,还包含了Service核心组件。

    <? xml version='1.0' encoding='utf-8'? >
    <Server>
        <!-- 配置一个或多个Listener -->
        <Listener/>
        <!-- 配置JNDI资源 -->
        <GlobalNamingResources>
        	<Resource/>
        </GlobalNamingResources>
        <!--配置一个或多个Service-->
        <!--注意一个Tomcat实例中可以配置多个Service,这些Service通过监听不同的端口来区分-->
        <Service>
    		...
        </Service>
    </Server>
    

    Server组件在Tomcat中的实现类是StandardServer,除了表示Service的一个对象数组外,主要是一些关于Tomcat的属性,比如port,address等。

    3. Service组件

    Service组件是连接器(Connector)和容器(Container)的组合。一个Tomcat实例中可以有多个Service组件,它们彼此独立。StandardService是Service组件的实现类。如果上面的Server组件代表Tomcat服务器实例的话,那么Service组件就是这个服务器上面对外提供的一个个具体的服务。这个服务监听这不同的端口,你要访问哪些服务必须指定这些服务对应的端口。这样一类比的话就和具体的硬件服务器很像。

    public class StandardService extends LifecycleMBeanBase implements Service
    {
        private Server server = null;
        protected Connector connectors[] = new Connector[0];
        private Engine engine =null;
        protected final Mapper mapper = new Mapper();
    
    }
    

    server表示其所属Server,Engine作为处理该service中Connector的容器。Mapper可以看作是映射器,要来处理请求地址到处理该请求的容器及Servlet的映射。

    另外,service组件还有一个Executor组件,这个线程池组件可以让多个连接器组件共享,而不是每个连接器组件都使用自己的线程池。

    4. Connector组件

    表示Tomcat中的连接器,其主要作用是监听并转化Socket请求,并交由Container处理。其实就是对不同协议及协议处理器进行的封装。下面是我们需要关注的几个属性域:

    public class Connector extends LifecycleMBeanBase
     {
    	protected Service service = null;
        protected final ProtocolHandler protocolHandler;
    }
    

    不同的协议会对应不同的Connector,目前Tomcat支持HTTP(HTTPS)和AJP两种协议的Connector。另外同一种协议的内部也会根据网络IO方式的不同分为阻塞IO和非阻塞IO。下面以HTTP协议为列子简单介绍:

    • Http11Protocol组件,是HTTP协议1.1版本的抽象,它包含接收客户端连接、接收客户端消息报文、报文解析处理、对客户端响应等整个过程。它主要包含JIoEndpoint组件和Http11Processor组件。启动时,JIoEndpoint组件内部的Acceptor组件将启动某个端口的监听,一个请求到来后将被扔进线程池Executor,线程池进行任务处理,处理过程中将通过Http11Processor组件对HTTP协议解析并传递到Engine容器继续理。
    • Mapper组件,客户端请求的路由导航组件,通过它能对一个完整的请求地址进行路由,通俗地说,就是它能通过请求地址找到对应的Servlet。
    • CoyoteAdaptor组件,一个将Connector和Container适配起来的适配器。

    如上图所示,在非阻塞I/O方式下,Connector的结构类似阻塞模式,Http11Protocol组件改成Http11NioProtocol组件,JIoEndpoint组件改成NioEndpoint, Http11Processor组件改成Http11NioProcessor组件,这些类似的组件的功能也都类似。唯独多了一个Poller组件,它的职责是在非阻塞I/O方式下轮询多个客户端连接,不断检测、处理各种事件,例如不断检测各个连接是否有可读,对于可读的客户端连接则尝试进行读取并解析消息报文。

    5. Engine组件

    Tomcat内部有4个级别的容器,分别是Engine、Host、Context和Wrapper。Engine代表全局Servlet引擎,每个Service组件只能包含一个Engine容器组件,但Engine组件可以包含若干Host容器组件。除了Host之外,它还包含如下组件。

    • Listener组件:可以在Tomcat生命周期中完成某些Engine容器相关工作的监听器。
    • AccessLog组件:客户端的访问日志,所有客户端访问都会被记录。
    • Cluster组件:它提供集群功能,可以将Engine容器需要共享的数据同步到集群中的其他Tomcat实例上。
    • Pipeline组件:Engine容器对请求进行处理的管道。
    • Realm组件:提供了Engine容器级别的用户-密码-权限的数据对象,

    6. Host组件

    Tomcat中Host组件代表虚拟主机,这些虚拟主机可以存放多个Web应用的抽象(Context容器)。除了Context组件之外,它还包含如下组件。

    • Listener组件:可以在Tomcat生命周期中完成某些Host容器相关工作的监听器。

    • AccessLog组件:客户端的访问日志,对该虚拟主机上所有Web应用的访问都会被记录。

    • Cluster组件:它提供集群功能,可以将Host容器需要共享的数据同步到集群中的其他Tomcat实例 上。

    • Pipeline组件:Host容器对请求进行处理的管道。

    • Realm组件:提供了Host容器级别的用户-密码-权限的数据对象,配合资源认证模块使用。

    7. Context组件

    Context组件是Web应用的抽象,我们开发的Web应用部署到Tomcat后运行时就会转化成Context对象。它包含了各种静态资源、若干Servlet(Wrapper容器)以及各种其他动态资源。它主要包括如下组件。

    • Listener组件:可以在Tomcat生命周期中完成某些Context容器相关工作的监听器。
    • Filter组件:过滤器组件,提供统一的业务逻辑处理。
    • AccessLog组件:客户端的访问日志,对该Web应用的访问都会被记录。
    • Pipeline组件:Context容器对请求进行处理的管道。
    • Realm组件:提供了Context容器级别的用户-密码-权限的数据对象,配合资源认证模块使用。
    • Loader组件:Web应用加载器,用于加载Web应用的资源,它要保证不同Web应用之间的资源隔离
    • Manager组件:会话管理器,用于管理对应Web容器的会话,包括维护会话的生成、更新和销毁。
    • NamingResource组件:命名资源,它负责将Tomcat配置文件的server.xml和Web应用的context.xml资源和属性映射到内存中。
    • Mapper组件:Servlet映射器,它属于Context内部的路由映射器,只负责该Context容器的路由导航.
    • Wrapper组件:Context的子容器。

    8. Wrapper组件

    Wrapper容器是Tomcat中4个级别的容器中最小的,与之相对应的是Servlet,一个Wrapper对应一个Servlet。它包含如下组件。

    • Servlet组件:Servlet即Web应用开发常用的Servlet,我们会在Servlet中编写好请求的逻辑处理。
    • ServletPool组件:Servlet对象池,当Web应用的Servlet实现了SingleThreadModel接口时则会在Wrapper中产生一个Servlet对象池。线程执行时,需先从对象池中获取到一个Servlet对象,ServletPool组件能保证Servlet对象的线程安全。
    • Pipeline组件:Wrapper容器对请求进行处理的管道。
  • 相关阅读:
    WPF 柱状图显示数据
    WPF 寻找控件模板中的元素
    WPF 寻找数据模板中的元素
    WPF VisualTreeHelper的使用
    WPF依赖项属性不需要包装属性也可以工作
    WPF依赖属性对内存的使用方式
    WPF Binding Path妙用
    WPF Binding Path妙用代码实现
    WPF Binding妙处-既无Path也无Source
    WPF ListView的使用
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/13221789.html
Copyright © 2020-2023  润新知