zoukankan      html  css  js  c++  java
  • Tomcat架构解析(一)-----Tomcat总体架构

      Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助。

      一、Server

      1、最简单的服务器结构

      最简单的服务器结构如图所示:

     

      Server向客户端提供服务,并且服务器可以start或stop。

      缺点:如果需要该服务器支持多种网络协议,就很难扩展,因此改进如下:

       

      2、Connector和Container

      

      将容器拆分成Connector以及Container,Connector用于和客户端连接,可以扩展支持多种协议,建立连接之后将socket交给Container处理。

      缺点:一个Server存在多个Connector和Container,因此Connector和Container之间就需要建立比较繁琐的映射关系,改进如下:

      3、加入Service

      

      一个Server包括多个Service,一个Service可以包含多个Connector和一个Container,这样Connector在获得客户端的socket之后,交给对应的Service,由Service来找到对应的Container,进而处理客户端的相关请求。

      缺点:应用服务器是一个运行环境,可能会有很多项目部署在Tomcat中,因此改进如下:

      4、引入Context

      

      将Container换成Engine,Context则表示应用本身,同时Engine和Context都包含start、stop方法,代表各个容器启动、关闭的行为,将各个容器加载资源、释放资源的动作解耦。

      缺点:通常在一个主机下,提供多个域名的服务,因此引入Host,如下:

      5、引入Host

      

      缺点:一个Context中可以包含多个servlet实例,称为Wrapper,改进如下:

      

      6、Wrapper

      

      Engine、Host、Context、Wrapper是一类组件,这类组件的作用就是处理接收客户端的请求并且返回响应数据,并且有可能请求到Engine容器,Engine容器委托给子容器Host处理,修改如下:

      

      使用Container代表容器,Engine、Host、Context、Wrapper都是Container的子容器,Container可以维护子容器。backgroundProcess()方法针对后台处理,并且其基础抽象类(ContainerBase)确保在启动组件的同时,异步启动后台处理。

      Tomcat的总体架构大致如此。

      二、Lifecycle生命周期

      所有的容器中都存在start()、stop()等方法,因此抽象出Lifecycle接口,该接口中定义了相关的生命周期的方法。主要方法如下:

      

      

       

      Lifecycle状态图:

      

      三、Pipeline和Valve

      对于应用服务器来说,增强各组件的扩展性以及灵活性是非常重要的,Tomcat采用职责链模式来实现每个Container组件处理请求的功能。

      Pipeline代表职责链,后者表示阀门,具体的处理过程,如图所示:

      

      说的简单点,就是每条线路上包含哪些操作,操作按照顺序一个个执行。Tomcat通过这种方式来决定每个容器的执行过程。之前的Tomcat架构图加上职责链如下所示:

      

      简单的来说,Tomcat监听客户端的请求,获得请求后交个各个组件去处理,返回响应数据到客户端,并且Tomcat能支持HTTP、AJP等协议。并且在扩展性、可用性上有着非常优秀的设计。

    四、tomcat工作原理

    我们启动Tomcat时双击的startup.bat文件的主要作用是找到catalina.bat,并且把参数传递给它,而catalina.bat中有这样一段话:

    Bootstrap.class是整个Tomcat 的入口,我们在Tomcat源码里找到这个类,其中就有我们经常使用的main方法:

    这个类有两个作用 :1.初始化一个守护进程变量、加载类和相应参数。2.解析命令,并执行。

    另外tomcat中有一个非常重要的xml,server.xml,来看下server.xml对应的真实的tomcat架构是啥样的。

  • 相关阅读:
    C++ 动态多维数组的申请与释放
    OpenCV视频的读写
    Python 函数的参数传递
    Python 赋值、浅拷贝和深拷贝
    操作系统学习笔记(七) 死锁
    操作系统学习笔记(六) 文件系统
    浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
    heap与stack的区别
    深入学习golang中new与make区别
    Linux CentOS 7 安装confluence 5.8.10
  • 原文地址:https://www.cnblogs.com/alimayun/p/10604532.html
Copyright © 2011-2022 走看看