美文网首页
tomcat(1.总体设计)

tomcat(1.总体设计)

作者: 北风第一支 | 来源:发表于2017-05-30 23:03 被阅读0次

Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载servlet的,但,当使用一些MVC框架时,如 spirngmvc、strusts2,可能就找不出servlet在哪里?其实spring MVC框架就是一整个servlet,在web.xml中配置如下:

    <servlet>  
        ...
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        ...

而Struts2是基于过滤器,过滤器调用在servlet之前

<filter>  
    <filter-name>struts2</filter-name>  
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>struts2</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

总体结构用下图来表示:


Paste_Image.png

Tomcat中主要涉及Server,Service,Engine,Connector,Host,Context组件,,在conf目录中有一个server.xml文件:

<?xml version='1.0' encoding='utf-8'?>
<Server port="7996" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <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="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="7888" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

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

Tomcat加载时相应组件(容器)的配置参数都是从这个文件读进去的,这个文件也是Tomcat性能优化的关键。

Server

Server是Tomcat中最顶层的组件,它可以包含多个Service组件。在Tomcat源代码中Server组件对应源码中的 org.apache.catalina.core.StandardServer 类。StandardServer的继承关系图如下图所示:


Paste_Image.png

Lifecycle是Tomcat的生命周期接口。保持组件启动和停止一致的的机制,通过实现org.apache.catalina.Lifecycle接口来实现。

Service

Service组件相当于Connetor和Engine组件的包装器,它将一个或者多个Connector组件和一个Engine建立关联。上述配置文件中,定义一个叫Catalina的Engine,并将Http,AJP(定向包的协议)这两个Connector关联到了这个Engine,注意一个Connetor对应处理一种协议。Service组件对应Tomcat源代码中的org.apache.catalina.core.StandardService,StandardService的继承关系图如下图所示:


Paste_Image.png

Connector

既然Tomcat需要提供http服务,而我们知道http应用层协议最终都是需要通过TCP层的协议进行传递的,而Connector正是Tomcat中监听TCP网络连接的组件,一个Connector会监听一个独立的端口来处理来自客户端的连接。缺省的情况下Tomcat提供了如下两个Connector。我们分别描述一下:
HTTP/1.1
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 上面定义了一个Connector,它缺省监听端口8080,这个端口我们可以根据具体情况进行改动。connectionTimeout定义了连接超时时间,单位是毫秒,redirectPort定义了ssl的重定向接口,根据缺省的配置,Connector会将ssl请求重定向到8443端口。
AJP/1.3
AJP表示Apache Jserv Protocol,此连接器将处理Tomcat和Aapache http服务器之间的交互,这个连接器是用来处理我们将Tomcat和Apache http服务器结合使用的情况。假如在同样的一台物理Server上面部署了一台Apache http服务器和多台Tomcat服务器,通过Apache服务器来处理静态资源以及负载均衡的时候,针对不同的Tomcat实例需要AJP监听不同的端口。
Connector对应源代码中的org.apache.catalina.connector.Connector,它的继承关系图如下所示:


Paste_Image.png

Engine

Tomcat中有一个容器的概念,而Engine,Host,Context都属于Contanier,我们先来说说最顶层的容器Engine.
一个Engine可以包含一个或者多个Host,也就是说我们一个Tomcat的实例可以配置多个虚拟主机。
缺省的情况下<Engine name="Catalina" defaultHost="localhost">定义了一个名称为Cataline的Engine.Engine对应源代码中的org.apache.catalina.core.StandardEngine,它的继承关系图如下图所示:


Paste_Image.png

Host

Host定义了一个虚拟主机,一个虚拟主机可以有多个Context,缺省的配置如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">….</Host> 其中appBase为webapps,也就是<CATALINA_HOME>\webapps目录,unpackingWARS属性指定在appBase指定的目录中的war包都自动的解压,缺省配置为true,autoDeploy属性指定是否对加入到appBase目录的war包进行自动的部署,缺省为true.
Host对应源代码中的org.apache.catalina.core.StandardHost,它的继承关系图如下所示:


Paste_Image.png

Context

在Tomcat中,每一个运行的webapp其实最终都是以Context的形成存在,每个Context都有一个根路径和请求URL路径,Context对应源代码中的org.apache.catalina.core.StandardContext,它的继承关系图如下图所示:

Paste_Image.png
在Tomcat中我们通常采用如下的两种方式创建一个Context.下面分别描述一下:
1、在<CATALINA-HOME>\webapps目录中创建一个目录,这个时候将自动创建一个context,默认context的访问url为http://host:port/dirname
2、conf\server.xml文件中增加context元素。 第二种创建context的方法,我们可以选择在server.xml文件的<Host>元素,比如我们在server.xml文件中增加如下内容:
<Host>  
   <Valve ...
    <Context path="/mypath" docBase="/Users/xxx" reloadable="true">  
      </Context>  
</Host>  

</Host>

Valve

Valve中文意思是阀门,Valve是Tomcat中责任链模式的实现,通过链接多个Valve对请求进行处理。每个容器都有一个流水线Pipeline(过滤器链),每个流水线至少有一个阀门。tomcat 默认定义了一个名为org.apache.catalina.valves.AccessLogValve
的Valve,这个Valve负责拦截每个请求,然后记录一条访问日志。

相关文章

网友评论

      本文标题:tomcat(1.总体设计)

      本文链接:https://www.haomeiwen.com/subject/jzhrfxtx.html