前言
Tomcat作为目前非常流行的web容器,其架构设计是非常值得我们借鉴的,它的生命周期管理、多级容器的协调工作,同时在Tomcat中运用了很多设计模式。
顶层架构
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 "%r" %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为这个抽象观察者