zoukankan      html  css  js  c++  java
  • Tomcat内部结构、工作原理、工作模式和运行模式

    TOMCAT的内部结构

    Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的是Catalina servlet容器,其他组件按照一定的格式要求配置在这个顶层容器中。Tomcat的各种组件都是在Tomcat安装目录下的/conf/server.xml文件中配置的。

    TOMCAT的四种组件

    1.顶层类元素
    比如Server和Service

    2.连接器类元素
    连接器类元素代表了介于客户与服务之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应传递给客户。

    3.容器类元素
    容器类元素代表处理客户请求并生成响应结果的组件,有三种容器类元素:Engine、Host和Context。Engine为特定的Service组件处理所有客户的请求,Host组件为特定的虚拟主机处理所有的客户请求。Context组件为特定的Web应用处理所有的客户请求。

    4.嵌套类元素
    嵌套类元素代表了可以添加到容器中的组件,比如Logger元素、Valve元素和Realm元素。

    TOMCAT的体系结构

    Tomcat的体系结构可以由Server.xml看出一二

    <Server>   ...   
    
        <Service>    ...  
        <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" 
        译:service由多个connectors组成,多个service共享一个container(容器)。
    
        Note: A "Service" is not itself a "Container",so you may not define subcomponents such as 
        "Valves" at this level.Documentation at /docs/config/service.html -->       
    
            <Connector>  ...
            <!--The connectors can use a shared executor, you can define one or more named thread pools-->
            译:多个connector共享一个执行器(指Engine),你能定义一个或多个线程进入线程池。//这个按照我的理解翻译的
    
            <!-- A "Connector" using the shared thread pool-->
            译:一个connector共享一个线程池
            </Connector>
    
            <Engine> ...  
            <!-- An Engine represents the entry point (within Catalina) that processes every request.
            译:一个Engine代表处理灭个request请求的入口点(在Catalina中)
             The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host).
             Documentation at /docs/config/engine.html -->
    <!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> 
    
                <Host>   ... 
    
                    <Context>  ...
    
                    </Context>
    
                </Host>
    
            </Engine>
    
        </Service>
    
    </Server>

    这里写图片描述
    Server元素代表整个Catalina Servlet容器,它是Tomcat实例的顶层元素,其中可以包含一个或者多个Service元素。

    Service元素中包含一个Engine元素以及一个或者个多个Connector元素,这些Connector共享同一个Engine元素。

    Connector元素代表和客户程序实际交互的组件,它负责接受客户的请求,以及向客户返回响应结果。

    每个Service元素只能包含一个Engine元素,Engine元素可以处理在同一个Service中所有Connector元素接受到的客户请求。

    一个Engine元素中可以包含多个Host元素。

    每个Host元素定义了一个主机,它可以包含一个或者多个Web应用。

    Context是使用得最频繁的元素,每个Context元素代表了运行在虚拟机上的单个Web应用,一个Host元素中可以包含多个Context元素。

    CONTAINER与CONNECTOR

    Connecter组件
    一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。

    Tomcat中有两个经典的Connector,一个直接侦听来自Browser的HTTP请求,另外一个来自其他的WebServer请求。Cotote HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,Coyote JK2 Connector在端口8009处侦听其他Web Server的Servlet/JSP请求。

    Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。

    Container组件
    Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。

    Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。

    Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。

    TOMCAT的工作原理

    Tomcat作为Servlet容器,负责处理客户请求,把请求传送给Servlet并把结果返回给客户。
    Servlet容器与Servlet接口是由Java Servlet API定义的。

    tomcat和tomcat中的应用(即webapps下的war包)是运行在同一个jvm中的,但分工不同。
    tomcat的角色是“调度员”,而你的应用的角色是“工作者”,tomcat处理一个请求的大致过程如下:
    这里写图片描述
    1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。

    2、tomcat将此请求作为任务加入一个队列中,线程池中若干工作者线程从这个队列中获取任务,并把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。

    3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。

    4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。

    5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。

    6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。

    7、Context把执行完之后的HttpServletResponse对象返回给Host。

    8、Host把HttpServletResponse对象返回给Engine。

    9、Engine把HttpServletResponse对象返回Connector。

    10、Connector把HttpServletResponse对象返回给客户Browser。

    TOMCAT的工作模式和运行模式

    工作模式

    Tomcat作为servlet容器,有三种工作模式:

    1、独立的servlet容器,servlet容器是web服务器的一部分;

    2、进程内的servlet容器,servlet容器是作为web服务器的插件和java容器的实现,web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足;

    3、进程外的servlet容器,servlet容器运行于web服务器之外的地址空间,并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优;

    运行模式

    Tomcat Connector(连接器)有三种运行模式:
    1.bio(blocking I/O)
    即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。
    一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源。

    2.nio(new I/O)
    Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
    利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。

    3.apr(Apache Portable Runtime/Apache可移植运行时)
    Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

  • 相关阅读:
    Spring学习笔记(二)----Spring IOC
    LeetCode----正则表达式匹配「动态规划」
    Markdown----一款轻量级标记语言
    LeetCode----最长回文子串「动态规划」
    数据结构(六)
    数据结构(五)
    HDOJ3613解题报告【拓展KMP】
    HDOJ1358解题报告【KMP算法next数组的使用】
    POJ1990解题报告【树状数组】
    HDOJ1507解题报告【二分图染色】
  • 原文地址:https://www.cnblogs.com/lgj8/p/12095603.html
Copyright © 2011-2022 走看看