Tomcat主要构件,Tomcat构件
Tomcat主要构件,Tomcat构件
Tomcat是什么?
Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器。
Tomcat实现了几个Java EE规范,包括Java Servlet、Java Server Pages(JSP),Java Expression Language和Java WebSocket等.
因为实现了Servlet规范,所以Tomcat也是一个Servlet容器,可以运行我们自己编写的Servlet应用程序处理动态请求。
Tomcat主要架构
标准的Tomcat配置文件如下:
<Server port="8005" shutdown="SHUTDOWN">
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<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" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="192.168.1.50">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="192.168.1.50" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="192.168.1.50_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
Tomcat中主要涉及Server,Service,Engine,Connector,Host,Context组件, 如下图:
组件的包含关系如下:
Container分成4个级别的容器,而且这四个级别容器的关系为父子关系。真正的顶层容器是Engine。Container作为容器,存在几个概念上的级别:
● Server只有一个实例,内部包含多个Service
● Service可以看做包含多个Connector和唯一一个Engine关系的容器。
● Engine 表示一个Servlet引擎,它可以包含一个或多个子容器,比如Host或者Context容器;
● Host 表示一台虚拟的主机,它可以包含一系列Context容器;
● Context 表示一个唯一的ServletContext,一个 Context 对应一个 Web 工程,它可以包含一个 或多个Wrapper容器;
● Wrapper 表示一个独立的Servlet定义,即Wrapper本质就是对Servlet进行了一层包装。
Server
Server是Tomcat中最顶层的组件,是service的集合,即可包含多个service,Server控制整个Tomcat的生命周期。通常一个JVM只能包含一个Tomcat实例。
在Tomcat源代码中Server组件对应源码中的 org.apache.catalina.core.StandardServer 类
默认配置表示监听在8005端口以接收shutdown命令,默认仅允许通过本机访问。
Service
Service组件相当于Connetor和Engine组件的包装器,它将一个或者多个Connector组件和一个Engine建立关联,每个Connector通过一个特定的端口和协议接收请求,并将其转发至关联的Engine进行处理。
Engine
一个 Engine代表一个完整的 Servlet 引擎,它接收来自Connector的请求,并决定传给哪个Host来处理,Host处理完请求后,将结果返回给Engine,Engine再将结果返回给Connector。
一个Engine元素必须嵌套在Service元素内,它可以包含多个host组件,还可以包含Realm、Listener和Valve等子容器。
Connector
一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。
一个Engine可以配置多个连接器,但这些连接器必须使用不同的端口。
一般说来,连接器类型可以分为两种:
1. HTTP连接器
HTTP连接器直接侦听来自Browser的HTTP请求。
它又分三种不同的实现:Java Nio Connector、Java Nio2 Connector、APR/native Connector,它们的对比如下:
默认配置文件,定义了一个连接器为protocol=”HTTP/1.1” 表示的是使用自动切换机制来选择基于Java NIOConnector或基于APR /Native Connector(需要设置),也可以手动指定,
2. AJP 1.3连接器
AJP连接器接受来自其他的WebServer请求,
AJP协议是基于二进制的格式在Web服务器和Tomcat之间传输数据,这比HTTPP获得更好的效率,但比较复杂不通用。
Host
Host(虚拟主机)类似于Apache中的虚拟主机,Engine可以包含多个Host,每个Host代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们,每个虚拟主机对应的一个域名,不同Host容器接受处理对应不同域名的请求。
一个Engine至少要包含一个Host组件,而在Host元素内可以嵌入与此虚拟主机关联的Web应用程序的Context等元素。
Context
Context(上下文)表示在特定虚拟主机中运行的Web应用程序,每一个运行的webapp其实最终都是以Context的形成存在,每个Context都有一个根路径和请求URL路径,
Context是Servlet规范的实现,它提供了Servlet的基本环境,一个Context代表一个运行在Host上的Web应用,
Context对应源代码中的org.apache.catalina.core.StandardContext
Wrapper
Context可以包含多个Wrapper,Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。
Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。
Servlet 实例在 Context 中是以 Wrapper 出现的,Wrapper封装了Servlet,
四个基础阀门
StandardEngineValve:StandardEngine中的唯一阀门,主要用于从request中选择其host映射的Host容器StandardHost。
StandardHostValve:StandardHost中最后的阀门,主要用于从request中选择其context映射的Context容器StandardContext以及访问request中的Session以更新会话的最后访问时间。
StandardContextValve:StandardContext中的唯一阀门,主要作用是禁止任何对WEB-INF或META-INF目录下资源的重定向访问,对应用程序热部署功能的实现,从request中获得StandardWrapper。
StandardWrapperValve:StandardWrapper中的唯一阀门,主要作用包括调用StandardWrapper的loadServlet方法生成Servlet实例和调用ApplicationFilterFactory生成Filter链。
详情参照: https://blog.csdn.net/yangsnow_rain_wind/article/details/80053703
Pipeline
(1)Container可以包含多个子容器,一个父容器(组合模式);
(2)每个Container包含一个Pipeline,一般以在成员变量定义处完成实例初始化:
/**
* The Pipeline object with which this Container is associated.
*/
protected final Pipeline pipeline = new StandardPipeline(this);
(3)每个Pipeline包含一个Valve链,一个Pipeline上有多个Valve,Pipeline拥有第一个Valve的引用,Valve之间通过next链接,每个节点只需知道下一个节点而不需要维护整个Valve链这也是责任链模式的好处;
(4)每个容器对应的Pipeline有一个基本Valve,如图中的StandardEngineValve,它通常至于这个Pipeline对应Valve链的最后保证请求数据可以传递到下一个容器。
Valve
Valve(阀门)类似于过滤器,用来拦截请求并在将其转至目标之前进行某种处理操作;它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。
Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
Manger对象
Manager对象用于实现HTTP会话管理的功能,默认是StandardManager
备注: 部分内容引用:
https://blog.csdn.net/jiaomingliang/article/details/47393141
相关文章
- 暂无相关文章
用户点评