vlambda博客
学习文章列表

Tomcat第一篇---浅析工作原理

今天和大家聊下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 &quot;%r&quot; %s %b" />     <Context path="first" docBase="c:\work\aa" /> </Host> </Engine> </Service></Server>

Tomcat第一篇---浅析工作原理

结合图和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第一篇---浅析工作原理


tomcat是如何找到servlet的


注解的方式


另一种web.xml配置的情况

今天就到这,后面再细说。