笔者在周末的时候看了下tomcat的源码,再结合了一些查询到的资料,总结了一下Tomcat的组成和架构,这里记录下。
一、Tomcat是什么?主要是用来做什么的?
Tomcat 就是一个 Servlet 容器。为了方便使用,它也具有 HTTP 服务器 的功能,因此 Tomcat 就是一个“HTTP 服务器 + Servlet 容器”,我们也叫 它们 Web 容器。
Tomcat所做的事情主要有:开启监听端口监听用户的请求,解析用户发来的http请求然后访问到你指定的应用系统,然后你返回的页面经过Tomcat返回给用户。
二、Tomcat的核心组件
Tomcat的核心组件主要六个,分别是:
- Server(服务器):Server的主要任务就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的生命周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。(一个Server元素中可以有一个或多个Service元素)
- Service(服务):Service的作用是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。(一个Service可以包含多个Connector,但是只能包含一个Engine);
- Connector(连接器):Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine;
- Engine(引擎):Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端(Engine组件在Service组件中有且只有一个;defaultHost属性必须与Engine中的一个Host组件的name属性值匹配);
- Host(虚拟机):Host虚拟主机的作用是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用(Host是Engine的子容器,Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机;Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配);
- Context(应用上下文):Context代表在特定虚拟主机上运行的一个Web应用(一个host 下可以配置多个Context ,每个Context 都有其独立的 classPath。相互隔离,以免造成ClassPath 冲突Context是Host的子容器,每个Host中可以定义任意多的Context元素);
它们之间的关系如下图:
三、Tomcat的应用架构
Tomcat的应用架构在它的配置文件:server.xml表现的非常清晰。
server.xml:
<Server port="8005" shutdown="SHUTDOWN">
<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">
<Context path="/" docBase="D:\Program Files \app1.war" reloadable="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>
Tomcat其实就分为两大部分,一部分是连接器
(Connnector)处理对外连接,另一部分是容器(Container)管理对内的Servelet。
关系总结:
Server元素在最顶层,代表整个Tomcat容器;一个Server元素中可以有一个或多个Service元素。Service在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;Connector接收请求,Engine处理请求。
Engine、Host和Context都是容器,且 Engine包含Host,Host包含Context。每个Host组件代表Engine中的一个虚拟主机;每个Context组件代表在特定Host上运行的一个Web应用。