源码分析tomcat的体系结构
tomcat原理:
- 在端口监听socket请求
- 解析请求
- 返回处理结果
tomcat的体系结构图
Server:代表整个tomcat服务器实例,tomcat只有一个server,但server至少应该包含一个service
Service:服务,接收客户端请求、处理请求、返回响应
Connector:监听端口,建立连接,解析请求数据,封装为Request、Response
Container:负责处理请求,输出响应,是一个抽象概念(因为在server.xml文件中没有这个节点),具体分为4层(Container使用到了责任链模式):
- Engine:引擎,一个Service只有一个Engine,主要是负责执行业务逻辑
- Host:虚拟主机,一个tomcat可以配置多个虚拟主机
- Context:每个Context就是一个Web项目,Context Path就是项目的访问路径
- Wrapper:容器,每个容器封装着一个Servlet
源码分析tomcat的server.xml文件(为了更好的演示,我把多余的注释删掉了)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 在8005端口监听到"SHUTDOWN"命令,服务器端就会停止 -->
<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">
<!-- 连接器 -->
<!-- 监听8080端口,定义连接超时时间为20000毫秒,Connector会将ssl请求转发到8443端口 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 引擎,容器当中的一种 -->
<!-- 定义了一个叫Catalina的引擎 -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 主机,默认就是localhost -->
<!-- 在主机localhost中,加入到webapps目录中的war包会自动解压和部署 -->
<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>