Tomcat 分为很多组件,这些组件一起协同工作。
这些组件包括: Server,Service,Connector,Engine,Host,Context,Wrapper.
这么一堆组件,看起来比较复杂,怎么去理解呢?本文主要来个top level view 。
回到我们最初的对servlet 容器的理解,一个servlet 容器最重要的功能无非就是接受http 请求,解析http 请求生成request ,并调用servlet ,生成响应response 。那么以上工作的入口在哪里,没错,那就是Connector 组件。先来认识一下Connector 组件。
Connector组件
Connector 主要功能是Socket 连接等待Http 请求,创建javax.servlet.http.HttpServletRequest 和javax.servlet.http.HttpServletResponse 实例,并将其作为参数调用容器。当然Connector 并不只处理http 协议的请求,支持多种协议如https ,AJP/1.3 等。不同的Connector 代表了不同的协议,同时在不同的端口上面监听。这个可以再Server.xml 里进行配置。connector的工作就像下图的前半部分:
(上图截自 tomcat developer guide )
从以上看出Connector 负责接受请求和生成request (Request 创建过程:parse header ,parse cookie ,parse parameter 、设置encodeing 等)和response 。再把参数传给容器。最后我们是要由url 请求对应的servlet 的service 方法来接收这两个参数,并处理生成response 。那么后面的load servlet 和invoke servlet 的工作就交给容器来处理了,容器说起来很抽象诶,它代表什么?下面介绍一下Container 。
Container组件
没错,容器只是一个抽象的概念,在tomcat 里Engine,Host,Context,Wrapper 都代表容器。它们各自的功能如下:
Engine :代表了整个Catalina servlet 引擎.
Host: 代表了一个具有多个应用实例(Context) 的虚拟主机( 注:tomcat 里默认只有一个localhost 虚拟主机,所有的请求默认都转发给它,它的应用实例都默认的放在webapps 目录下面。Tomcat 支持多虚拟主机,可以再server.xml 里面进行配置).
Context :代表了一个应用实例,也就是我们平常的一个web 应用。一个Context 有一个或者多个wrappers.
Wrapper: 代表了一个单独的servlet.
有了Connector 和Container(Engine,Host,Context,Wrapper) 似乎一个servlet 容器就可以工作了,那么文章一开始提到的Server 和Service 干啥用的呢?
Service组件
Service 包含了一个Engine 元素和多个Connector 元素。上文提到的connector 有多种,这些connector 可以共享一个servlet 引擎。同时分开运行。而其管理是有service 来管理的。
Server组件
Server 它代表了整个Servlet 容器。它提供了一套启动和停止整个系统的机制。而我们不用去关心内部的原理。它包含了一个或者多个service 实例。当你启动一个server ,它把所有的内部组件都初始化。同时它提供一个监听端口,时刻监听shutdown 命令。并负责整个系统的stop 过程。同时Server 也提供了JNDI 等其他java EE 服务的实现。可以再server 里初始化JNDI 数据源( 在server.xml 里配置) 。
以上包括了tomcat的全部组件,其关系可由下图片表示:
(上图截自 tomcat developer guide )
Server.xml配置文件
关心内部的一个Server起来的时候,它怎么知道要启动哪些Service或Connector?在server起来的时候是通过读取server.xml里的配置来组织和初始化整个容器,也就是说server.xml实际上就代表了一个server实例,它包含了server要在哪个端口上面监听shutdown,server使用哪个类?connector应该包括哪些,各个connector的监听端口和协议是什么?以及有几个host,host名称是什么?host的base目录在哪里?默认的context是哪个?还有Engine、service等等一些列属性。
下面看看一个tomcat默认的server.xml:
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<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"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
</Server>
最后再发一份关于tomcat的学习资料(How tomcat works.),感觉不错,有需要可以下载研究一下,不过是基于tomcat4、5的。
- 大小: 69.3 KB
- 大小: 33.9 KB
分享到:
相关推荐
Rust标准库内部原理(inside-rust-std-library)
解压“typora-inside-theme-master.zip”后,你会得到一个名为“typora-inside-theme-master”的文件夹,这个文件夹包含了所有与该主题相关的资源。为了启用这个主题,你需要将其复制到Typora的主题文件夹。通常,...
这本书《Inside ASP.NET Web API 2》会详细讲解这些概念,并通过实例演示如何在实践中应用它们。读者可以期待了解到如何设置项目、创建控制器、处理请求、响应处理、错误处理、安全性和性能优化等方面的全面知识。...
Inside-Delphi-2006-by-Ivan-Hladni
引言RUST无疑是编程语言史中最难学的高级语言,在仅依靠静态编译的前提下实现一门安全的编程语言,这是必须付出的代价。无论如何,成为一门编程语言的老手的最佳办法就
Deep Inside CSharp---An Interview with Microsoft Chief Architect Anders Hejlsberg
《Inside C#--C#编程从入门到精通》是一本深度解析C#编程语言的教程,旨在帮助初学者和有经验的程序员全面掌握C#的核心概念和技术。C#是由微软公司开发的一种面向对象的编程语言,广泛应用于Windows平台、游戏开发、...
k8s.gcr.io_-_阿里云_kubeadm-inside-the-great-wall
「大数据」hum-t10-turning-your-security-strategy-inside-out-managing-insider-threat - 安全认证 数据库安全 安全研究 应急响应 零信任 安全资讯
### 《Rising - Inside Your Calculator - From Simple Programs to Significant Insights》关键知识点解析 #### 标题解析 - **Rising - Inside Your Calculator**: 标题暗示了本书将深入探讨计算器内部的工作原理...
- **2D驱动程序**:提供高效的二维图形渲染能力。 - **Direct Rendering Infrastructure (DRI)**:实现直接到图形硬件的渲染,提高性能并降低延迟。 - **内核模块**:与图形硬件紧密相关的内核部分,如I/O接口、中断...
3D-inside-3d-mesh.zip,一种简短、合理、简单、快速且稳健的函数,用于确定一组点是否位于三维网格内,3D建模使用专门的软件来创建物理对象的数字模型。它是3D计算机图形的一个方面,用于视频游戏,3D打印和VR,以及...
Inside Windows Debugging - Practical Debugging and Tracing Strategies 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 ...
《Inside SQL Query Tuning and Optimization》是针对Microsoft SQL Server 2005的一款深度解析查询优化的专业书籍。这本书旨在帮助数据库管理员和开发人员深入理解SQL Server的查询处理机制,掌握如何编写高效的SQL...
await-top是一个使您可以使用顶级await的库。 不相信我吗? 举个例子: // test.js require = require ( './index' ) console . log ( 'Promise: %O' , require ( './test-2' , module ) . then ( ( x ) =...
西门子 plc Hans Berger Automating with 系列丛书 Automating with SIMATIC S7-400 inside TIA Portal-Publicis (2013).pdf
模擬試題:Cisco.Test-inside.642-813.v2013-11-01.by.Jack.Cross.197q
《Inside The C++ Object Model》是一本深入探讨C++对象模型的专业书籍,它为我们揭示了C++编程语言在底层是如何实现面向对象特性的。在这个压缩包文件中,包含的.chm文件是这本书的一个部分或者摘要,名为“Inside ...
In order to grant security permissions to JARs located inside the web application repository, use URLs of of the following format in your policy file: file:${catalina.base}/webapps/examples/WEB-INF/...