一、前言
tomcat我们很早便接触了,它作为应用服务器存在着,应用服务器与web服务器的区别是,他除了可以解析协议,包括http协议外,还可以处理业务逻辑暴露给应用程序。
通常提到tomcat容器会说他是一个容器,小编的理解是,我们开发中打成的war包(既web应用程序)可以通过扔到tomcat的webapp下面,当tomcat的容器起来了,我们的项目就可以访问了。他们tomcat是如何启动的呢,小编近期简单的了解了一下,望不吝赐教~
二、Tomcat顶层结构
图片来源于网络,是我见过较能体现tomcat结构的图了
大概展示了tomcat的结构,可以简单介绍一下各个模块:
- Server:服务器,一个tomcat即为一个服务器
- Service:Server中的一个逻辑功能层,一个Server可以包含多个service
- Connector:连接器,连接客户端请求,是Service的核心组件之一
- Container:其中包含了Engine一组虚拟主机集合,还有host,context。
- …
三、server.xml
刚看到这个图的时候确实有些蒙圈,不知所云,又回头看了server.xml之后发现这些东西竟然这么熟悉,在配置文件中,我相信大家都配过。
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Executor ...... />
<Connector ...... />
<Connector ...... />
<Engine name="Catalina" ... >
<Host name="localhost" ... >
<Context ... />
</Host>
</Engine>
</Service>
</Server>
3.1 Server
tomcat的顶层容器,代表整个tomcat服务,一个tomcat只有一个Server,Server中包含至少一个Service组件,用于提供具体的服务,在配置文件中的 Server port=“8005” shutdown=“SHUTDOWN” 很容易体现,当我们执行shutdown命令时,整个tomcat服务就关闭了,在tomcat中其对应的标准实现为:org.apache.catalina.core.StandardServer

3.2 Service
官方对他的解释是:由一个或一组连接器组成的服务,共享一个容器来处理他的传入请求。我们可以这样理解:接收客户端请求,解析请求,完成相关业务逻辑,将处理的结果返回给客户端。
如果将请求监听和请求处理放在一起,扩展性必然会变差,tomcat的设计采用的是请求监听和请求处理分开为两个模块,分别是Connector和Container,Connector负责处理请求监听,Container负责处理请求处理。在tomcat中其对应的标准实现为:org.apache.catalina.core.StandardService

3.3 Connector
Connector是连接器,用于接受请求,将请求封装成Request和Response,然后交给Engine处理,处理完后交给Connector返回给客户端。
一个Connector会监听一个独立的端口号来处理来自客户端的请求,server.xml中会有两个connector:
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />,
它监听端口8080,这个端口值可以修改,connectionTimeout定义了连接超时时间,单位是毫秒,redirectPort 定义了ssl的重定向接口,根据上述配置,Connector会将ssl请求转发到8443端口。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,
AJP表示Apache Jserv Protocol,它将处理Tomcat和Apache http服务器之间的交互,此连接器用于处理我们将Tomcat和Apache http服务器结合使用的情况,如在同一台物理Server上部署一个Apache http服务器和多台Tomcat服务器,通过Apache服务器来处理静态资源以及负载均衡时,针对不同的Tomcat实例需要AJP监听不同的端口。
3.4 Container
小编认为,tomcat中的Container是精神领袖一样的存在,我们之前提到的Engine,host ,context都是继承了BaseContainer。官方对于Container的定义是:容器是可以处理来自客户端的请求,并且对请求做出响应。Container的层次结构如下:

四、Tomcat的启动流程
tomcat的启动入口很清楚,下面的图说明了组件间的加载顺序及调用关系,以BootStrap为入口,通过main主入口即可进入:
五、总结
通过了解tomcat自己get到两点:1.容器的思想,在使用组件时,如果组件都装在一个容器中,使用起来很方便;2.每个组件都有自己的生命周期,我们是通过一个lifecyle来管理的,这样可以做到专事专办。