Tomcat主要构件

Tomcat是什么?

Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器。
Tomcat实现了几个Java EE规范,包括Java Servlet、Java Server Pages(JSP),Java Expression Language和Java WebSocket等.

因为实现了Servlet规范,所以Tomcat也是一个Servlet容器,可以运行我们自己编写的Servlet应用程序处理动态请求。

Tomcat主要架构

标准的Tomcat配置文件如下:


<Server port="8005" shutdown="SHUTDOWN">  
   <!--APR library loader. Documentation at /docs/apr.html -->  
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->  
  <Listener className="org.apache.catalina.core.JasperListener" />  
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->  
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />  


  <GlobalNamingResources>  

    <Resource name="UserDatabase" auth="Container"  
              type="org.apache.catalina.UserDatabase"  
              description="User database that can be updated and saved"  
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
              pathname="conf/tomcat-users.xml" />  
  </GlobalNamingResources>  

  <Service name="Catalina">  

   <Connector port="8080" protocol="HTTP/1.1"  
               connectionTimeout="20000"  
               redirectPort="8443" />  

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  
    <Engine name="Catalina" defaultHost="192.168.1.50">  

      <Realm className="org.apache.catalina.realm.LockOutRealm">        
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  
               resourceName="UserDatabase"/>  
      </Realm>  

      <Host name="192.168.1.50"  appBase="webapps"  
            unpackWARs="true" autoDeploy="true">  
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="192.168.1.50_access_log." suffix=".txt"  
               pattern="%h %l %u %t "%r" %s %b" />   
      </Host>  
    </Engine>  
  </Service>  
</Server>  

Tomcat中主要涉及Server,Service,Engine,Connector,Host,Context组件, 如下图:
这里写图片描述

组件的包含关系如下:
这里写图片描述

Container分成4个级别的容器,而且这四个级别容器的关系为父子关系。真正的顶层容器是Engine。Container作为容器,存在几个概念上的级别:
● Server只有一个实例,内部包含多个Service
● Service可以看做包含多个Connector和唯一一个Engine关系的容器。
● Engine 表示一个Servlet引擎,它可以包含一个或多个子容器,比如Host或者Context容器;
● Host 表示一台虚拟的主机,它可以包含一系列Context容器;
● Context 表示一个唯一的ServletContext,一个 Context 对应一个 Web 工程,它可以包含一个 或多个Wrapper容器;
● Wrapper 表示一个独立的Servlet定义,即Wrapper本质就是对Servlet进行了一层包装。


Server

Server是Tomcat中最顶层的组件,是service的集合,即可包含多个service,Server控制整个Tomcat的生命周期。通常一个JVM只能包含一个Tomcat实例。
在Tomcat源代码中Server组件对应源码中的 org.apache.catalina.core.StandardServer 类
默认配置表示监听在8005端口以接收shutdown命令,默认仅允许通过本机访问。


Service

Service组件相当于Connetor和Engine组件的包装器,它将一个或者多个Connector组件和一个Engine建立关联,每个Connector通过一个特定的端口和协议接收请求,并将其转发至关联的Engine进行处理。


Engine

一个 Engine代表一个完整的 Servlet 引擎,它接收来自Connector的请求,并决定传给哪个Host来处理,Host处理完请求后,将结果返回给Engine,Engine再将结果返回给Connector。

一个Engine元素必须嵌套在Service元素内,它可以包含多个host组件,还可以包含Realm、Listener和Valve等子容器。


Connector

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

一个Engine可以配置多个连接器,但这些连接器必须使用不同的端口。

一般说来,连接器类型可以分为两种:

1. HTTP连接器

HTTP连接器直接侦听来自Browser的HTTP请求。
它又分三种不同的实现:Java Nio Connector、Java Nio2 Connector、APR/native Connector,它们的对比如下:
这里写图片描述

默认配置文件,定义了一个连接器为protocol=”HTTP/1.1” 表示的是使用自动切换机制来选择基于Java NIOConnector或基于APR /Native Connector(需要设置),也可以手动指定,

2. AJP 1.3连接器

AJP连接器接受来自其他的WebServer请求,
AJP协议是基于二进制的格式在Web服务器和Tomcat之间传输数据,这比HTTPP获得更好的效率,但比较复杂不通用。


Host

Host(虚拟主机)类似于Apache中的虚拟主机,Engine可以包含多个Host,每个Host代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们,每个虚拟主机对应的一个域名,不同Host容器接受处理对应不同域名的请求。

一个Engine至少要包含一个Host组件,而在Host元素内可以嵌入与此虚拟主机关联的Web应用程序的Context等元素。


Context

Context(上下文)表示在特定虚拟主机中运行的Web应用程序,每一个运行的webapp其实最终都是以Context的形成存在,每个Context都有一个根路径和请求URL路径,
Context是Servlet规范的实现,它提供了Servlet的基本环境,一个Context代表一个运行在Host上的Web应用,
Context对应源代码中的org.apache.catalina.core.StandardContext


Wrapper

Context可以包含多个Wrapper,Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。

Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

Servlet 实例在 Context 中是以 Wrapper 出现的,Wrapper封装了Servlet,

四个基础阀门

StandardEngineValve:StandardEngine中的唯一阀门,主要用于从request中选择其host映射的Host容器StandardHost。
StandardHostValve:StandardHost中最后的阀门,主要用于从request中选择其context映射的Context容器StandardContext以及访问request中的Session以更新会话的最后访问时间。
StandardContextValve:StandardContext中的唯一阀门,主要作用是禁止任何对WEB-INF或META-INF目录下资源的重定向访问,对应用程序热部署功能的实现,从request中获得StandardWrapper。
StandardWrapperValve:StandardWrapper中的唯一阀门,主要作用包括调用StandardWrapper的loadServlet方法生成Servlet实例和调用ApplicationFilterFactory生成Filter链。

详情参照: https://blog.csdn.net/yangsnow_rain_wind/article/details/80053703


Pipeline

(1)Container可以包含多个子容器,一个父容器(组合模式);
(2)每个Container包含一个Pipeline,一般以在成员变量定义处完成实例初始化:

 /**
  * The Pipeline object with which this Container is associated.
  */
 protected final Pipeline pipeline = new StandardPipeline(this);

(3)每个Pipeline包含一个Valve链,一个Pipeline上有多个Valve,Pipeline拥有第一个Valve的引用,Valve之间通过next链接,每个节点只需知道下一个节点而不需要维护整个Valve链这也是责任链模式的好处;
(4)每个容器对应的Pipeline有一个基本Valve,如图中的StandardEngineValve,它通常至于这个Pipeline对应Valve链的最后保证请求数据可以传递到下一个容器。


Valve

Valve(阀门)类似于过滤器,用来拦截请求并在将其转至目标之前进行某种处理操作;它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。

Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。


Manger对象

Manager对象用于实现HTTP会话管理的功能,默认是StandardManager

备注: 部分内容引用:
https://blog.csdn.net/jiaomingliang/article/details/47393141

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页