Tomcat源码学习笔记-整体架构

前言

Tomcat作为目前非常流行的web容器,其架构设计是非常值得我们借鉴的,它的生命周期管理、多级容器的协调工作,同时在Tomcat中运用了很多设计模式。

顶层架构

1

Tomcat的架构设计非常的模块化,从上图可以看出最上层为Server服务器,为Service服务提供一个生存环境,掌握每个Service服务的生命周期,而每个Service则是对外提供的服务。

而每个Service包含两个核心组件Connector和Container,这两个组件的作用如下:

​ Connector:负责接收浏览器的TCP连接请求,提供Socket与Request、Response的相关转化,与请求端交换数据

​ Container:用于封装和管理Servlet,以及具体处理Request请求,是所有子容器的父接口(包括Engine、Host、Context、Wrapper)

从上图中可以看出一个Service服务对应一个Container,而可以对应多个Connector,一个服务对外可以提供不同协议的连接如Https、Http,也可以提供相同协议但是端口不同的连接。

我们从Tomcat的Server.xml中也可以窥探到Tomcat的一些设计,Tomcat默认监听8005端口,接收SHUTDOWN命令则关闭Tomcat。第一部分是Tomcat的一些监听器,第二部分是全局命名资源,第三部分就是Service服务了,包括了两个Connector,一个提供HTTP/1.1连接,默认端口就是常用的8080了,另外一个负责和其他的HTTP服务器建立连接。而Engine和Host则是嵌套的子容器。

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <!-- 1 -->
  <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" />

  <!-- 2   -->
  <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>

  <!-- 3 -->
  <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" />
      </Host>
    </Engine>
  </Service>
</Server>

除了两个核心组件,另外还有负责jsp页面解析、jsp属性验证,同时也负责将jsp页面动态转换为java代码并编译为class文件的Jasper组件,提供命名服务的Naming组件,提供Session服务的Session组件,负责日志记录的Logging组件,提供JVM监控服务的JMX组件。

生命周期

整个Tomcat的生命周期以观察者模式为基础

Subject 抽象主题:负责管理所有观察者的引用,同时定义主要的事件操作,而Tomcat核心类LifeCycle就是这个抽象主题,spring也有LifeCycle管理着整个生命周期

ConcretSubject 具体主题:实现抽象主题定义的所有接口,发生变化通知观察者,如StandardServer

Observer 观察者:监听主题变化的操作接口,LifeCycleListener为这个抽象观察者

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值