Tomcat第一篇---浅析工作原理
先宏观的了解一波
先上图。
宏观层面我们看下tomcat,tomact中包含一个server服务器容器,一个server中可以包含一个或者多个service,service由两个重要组件构成,connector和Container。一个service可以有多个connector,只能有一个Container。
connector负责处理连接相关事务,监听端口,并提供socket和request、response之间的相互转化。
Container 封装和管理servlet,处理request请求。
有了service,就可以对外提供静态资源和动态资源的访问服务了。server为service提供了生存环境。
结合配置文件在看
删除了注释的server.xml。
<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" />
<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" />
<Context path="first" docBase="c:\work\aa" />
</Host>
</Engine>
</Service>
</Server>
结合图和server.xml,具体分析下tomcat server的工作原理。
server标签,server标签监听8005端口,接收SHUTDOWN指令,用于结束tomcat服务。
service标签,然后我们跳过那堆Listener,看service标签,Catalina 就是Tomcat服务器使用的 Apache实现的servlet容器。
Connector标签,connector负责连接外部请求和service,tomcat可以作为独立服务器,响应web浏览器的请求,也可以作为应用服务器,来响应来自前端的web服务器,如Apache, IIS, Nginx等。因此connector不同的connector可以支持不同的协议,http/asp等等
Engine组件是servlet处理器的一个实例,需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。
Host组件位于Engine容器中,用于接收请求并进行相应处理的主机或虚拟主机
1、appBase:此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对路径;
2、autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
3、unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;
Context组件一个Context定义用于标识tomcat实例中的一个Web应用程序。
1、用户在浏览器输出网站http://www.xxx.com/customer/index.html
2、浏览器解析出域名www.xxx.com并且去请求DNS服务器,通过DNS获取相应的域名对应的IP和端口如(123.1.1.1:8080)
4、通讯双方连接之后,请求被发送到服务器端口8080
5、该端口是Tomcat中的server.xml的Connector配置port,所以此时请求被相应的Connector接收到
6、Connector把请求分配到它里边的Engine组件,由它来处理,并且等待其响应(Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议)
7、Engine收到请求之后,根据请求路径匹配到相应的host,交给host处理
8、host匹配相对路径/customer/index.html,找到相应的context
9、匹配到相应context后,根据路径访问相应的servlet
10、根据请求构造HttpServletRequest对象和HttpServletResponse对象,并调用* Servlet的doGet或doPost方法
11、servlet中处理逻辑之后,把HttpServletResponse对象返回给Host
12、host把HttpServletResponse逐级传递到Engine、Connector
13、最终把响应结果返回到客户端的浏览器
14、浏览器把结果渲染呈现
项目是如何部署的。
在tomcat文件夹下,并没有看到项目相关的文件,解释如下:
tomcat是如何找到servlet的
注解的方式
另一种web.xml配置的情况
今天就到这,后面再细说。