tomcat 简介
tomcat 是一个容器,可以用来调用servlet,jsp等。
jsp等格式会被tomcat编译成servlet再运行调用。
tomcat 架构
<?xml version='1.0' encoding='utf-8'?>
<Server>
<Service>
<Connector/>
<Engine>
<Host>
</Host>
</Engine>
</Service>
</Server>
Server
- 一个server就相当于一个tomcat
<Server port="8005" shutdown="SHUTDOWN"></Server>
Service
一个server里面可以有多个service。
<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"></Engine>
</Service>
Connector
Connector属于service内部,一个Connector与一个tcp端口绑定,监听用来接收用户的请求等。通常情况下监听两个基本的端口,一个是http协议的端口,用来做web服务;一个是AJP 连接Apache处理静态太文件。
<!--
port:属性指定监听端口,默认8080端口,可修改为1024-65535间的任意一个端口
protocol:支持协议
connectionTimeout:定义连接器等待时间,默认20秒
redirectPort:SSL请求会重定向到8443端口
-->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
容器 Container
- 包括Engine、Host、Context、Cluster
Engine
Engine中可以包含一个或者多个Host,可以配置默认主机。Engine容器会从HTTP Connector接收HTTP请求,并且会根据主机名/IP地址交由相应的主机处理请求。
<Engine name="Catalina" defaultHost="localhost"></Engine>
Host
一个Host元素代表了一个虚拟主机,默认主机名为localhost,支持多个Context。
<!--
appBase:定义了应用程序的根目录,默认是webapps
unpackWARS:定义了是否解压webapps中的WAR文件,如果指定为“false”,会从WAR文件直接运行程序,执行较慢
autoDeploy:把应用程序直接拖到webapps目录下,是否自动运行
-->
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>
Context
Host元素定义了虚拟主机,Context则是虚拟主机下的具体应用。
<!--
path:访问项目时的URL,加在localhost:8080后
docBase:path对应的项目目录
reloadable:监视 /WEB-INF/classes/ 和 /WEB-INF/lib目录中的类文件,更改后自动重载应用程序,
生成环境不建议使用,默认为“false”
-->
<Context path="" docBase="webapps/examples" reloadable="false"/>
各个板块name 的作用
- service : 就是这个服务的名字。
- Engine:引擎的名字与service相同。指定service中的请求处理机,接收和处理来自Connector的请求.
- host: name 与 Engine 的defaultHost 相同.指定主机名 .
结构图
开始学习
- 一个server至少包含一个service,Service 是对外提供服务的
- connector 和 container处于一个等级
- 一个service可以有多个connector,处理http,hhtps等
- 只有一个container
- Connector用于接受请求并将请求封装成Request和Response来具体处理
- Container用于封装和管理Servlet,以及具体处理request请求
请求过程
- 一个service由connector 和 container 组成。(主要的其他增强功能先不管)
主要的是connector 和 container
connector 是对tcp请求的封装,container模块则是对请求流程的封装,这里的封装是指如何将某一个请求分发给指定的servlet处理。
Connector分析
- Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。
-
其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。
-
Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request。
-
Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的。
-
Adapter将请求适配到Servlet容器进行具体的处理。
- 总的来说就是connector 接收前端的http请求,先接收到的是tcp请求需要自己打包成http请求,再丢给servlet容器去进一步处理。
endpoint (处理tcp请求)
- 虽然接收到的是tcp仔细看就是把http请求一行一行的发送过来了,只要我们能够把这些数据解析出来就能够打包成http数据包(request)。
Processor(处理http请求,我也没搞清楚)
- 这里把http请求发送给adapetr 处理。
Container分析(假设已经成功获取到connector模块的包装请求信息)
-
Container用于封装和管理Servlet,以及具体处理Request请求.
-
4个子容器的作用分别是:
(1) Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
(2) Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封装着一个Servlet;
- 这里重新定义四个子容器的作用。
- engine: 还是引擎,把用户的请求分发给host,host的name 就相当于一个key。
- host: 放项目的,把配置文件中的项目加载到这个模块。即把context(具体的项目)加载到这个模块。把请求分发到具体的context;(可以有多个)
- context:某个具体的web后台程序。其实这个板块主要由servlet组成,也是servlet的容器。把请求分发到具体的(servlet);
- wrapper: context的子模块,即一个servlet,它会根据项目里面web.xml配置中设置的servlet的配置去加载指定的servlet并保存下来,
container 加载(责任链模式)
Engine—Host—Context----Wrapper
主要涉及到的就是host和wrapper 这个两个模块。
- 部分图片来自于其他博主,时间久了也没找到原帖了。。