Tomcat 源码分析(二)

整体结构

Tomcat 由 Server、Service、Connector、Container、Jasper 和 Session 等组成。
结构图如下:
结构

简单介绍一下几个部分:

  1. Server:服务器的意思,代表整个tomcat服务器,一个tomcat只有一个Server;
  2. Service:Server中的一个逻辑功能层, 一个Server可以包含多个Service;
  3. Connector:称作连接器,是Service的核心组件之一,一个Service可以有多个Connector,主要是连接客户端请求;
  4. Container:Service的另一个核心组件,按照层级有Engine,Host,Context,Wrapper四种,一个Service只有一个Engine,其主要作用是执行业务逻辑;
  5. Jasper:JSP引擎;
  6. Session:会话管理;
  7. logging:日志;
  8. java EL: 对 el 表达式的支持;

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" 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="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" 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 &quot;%r&quot; %s %b" />
         <Context docBase="Example" path="/Example" reloadable="true" source="org.eclipse.jst.jee.server:Example"/>
      </Host>
    </Engine>
  </Service>
</Server>

从这个配置文件中可以看出tomcat的整体结构,下面做具体分析。

Server

Server是Tomcat最顶层的容器,代表着整个服务器(一个Tomcat只能有一个Server),Server中包含至少一个Service组件,用于提供具体服务。这个在配置文件中也得到很好的体现(port=“8005” shutdown="SHUTDOWN"是在8005端口监听到"SHUTDOWN"命令,服务器就会停止)

Service

Server 代表着 Tomcat 实例,而 Service 是 Tomcat 中一组用于处理请求的组件。Server 可以包含一个或多个 Service,每个 Service 将一组 Connector 组件和 Engine 关联起来。
在前面的Server文件中,定义了一个叫Catalina 的服务,它将 HTTP/1.1 和AJP/1.3 这两个 Connector 与一个名为 Catalina 的 Engine 关联起来。
客户端请求首先到达 connector, connector 再将这些请求轮流传入关联的 Engine 中处理。
需要注意的是 Service 仅仅是一个分组结构,它并不包含任何其他的附加功能。

Connector

Connector 是客户端连接到 Tomcat 容器的服务点,它为引擎提供协议服务来将引擎与客户端各种协议隔离开来,如 HTTP、HTTPS、AJP 协议。
一个Connector会监听一个独立的端口来处理来自客户端的请求。server.xml默认配置了两个Connector:

  • <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>,监听端口8080,连接超时时间是20000毫秒,ssl的重定向接口是 8443,根据上述配置,Connector 会将 ssl 请求转发到 8443 端口。
  • <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />, AJP表示Apache Jserv Protocol,它将处理 Tomcat 和 Apache http 服务器之间的交互,此连接器用于处理我们将 Tomcat 和 Apache http 服务器结合使用的情况,如在同一台物理 Server 上部署一个 Apache http 服务器和多台 Tomcat 服务器,通过 Apache 服务器来处理静态资源以及负载均衡时,针对不同的 Tomcat 实例需要 AJP 监听不同的端口。

Container

Container 是容器的父接口,由四个部分组成,分别是Engine、Host、Context、Wrapper

Engine

Engine 表示可运行的 servlet 引擎实例并且包含了 servlet 容器的核心功能。在一个 Service 中只能有一个引擎。同时,作为一个真正的容器,Engine元素之下可以包含一个或多个 Host。

Realm

Realm 是一个数据存储机制来保存用户名、密码以及角色,用于对用户所提供的凭证信息进行检查

Host

Host 代表一个站点,也可以叫虚拟主机,一个 Host 可以配置多个 Context

Context

Context,代表一个 web 应用程序。

Wrapper

wrapper 是 context 容器的子容器,表示一个单独的 servlet(或者由 jsp 文件转换而来的 servlet )。wrapper 是 tomcat 容器中的一部分,它具有容器的特征,而 Servlet 为了一个独立的 web 开发标准,不应该强耦合在 tomcat 中,故而每个 servlet 都使用一个wrapper包装

Valve

valve是处理元素,例如:日志处理,单点登录处理等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值