Tuesday, January 13, 2009

Tomcat结构分析

更多精彩请到 http://www.139ya.com


转自: Tomcat结构分析


1 Web服务器

通常,一个完整的Web服务器包含一个或多个“虚拟主机”.所谓虚拟主机,就是在一个物理的服务器上配置多个域名,每个域名对应相同或不同的应用.这样,客户端看起来好像是有多个主机;Web容器在收到请求时,根据客户端给出的域名来确定处理该请求的虚拟主机.在每个虚拟主机中又可以部署一个或多个Web应用.每个部署在服务器上的Web应用要提供对本应用的生命周期管理等功能. 尽管不同的Web服务器的实现各不相同,但都按照服务器-虚拟主机-应用的层次结构进行设计和管理.

2 Tomcat结构分析

Apache Tomcat是Servlet/JSP标准的参考实现,作为一个成功的、有着广泛应用的Web容器,Tomcat有着整齐而清晰的内部结构。其中关键的模块有:

Server. 一个Server模块代表了整个Tomcat容器.它的属性代表了Web容器作为一个整体的特征.一个Server模块主要包括一个或多个Service 模块以及顶层的命名资源.在运行期间,Server模块应监听port属性所指定的端口,并对于该端口接受的每一个连接读入其所传入的第1行信息并与 shutdown属性所指定的字串进行比较:如果两者相吻合,则执行关闭服务器的步骤;否则,不执行任何操作并断开连接.这种机制为容器的远程管理提供了可能.

Service.一个Service模块代表了共享同一个Container实例(通常是Engine实例)的一个或多个 Connector实例所组成的逻辑整体.该Container负责处理这个Service中所有Connector接受的请求.Service模块最主要的职责在于:允许加密的Connector以及普通的Connector连接到同一组Web应用.同一个Connector不能同时存在于两个不同的 Service中.在同一个Java虚拟机中可以同时存在多个Service实例,但这些实例除了共享最基本的Java运行时类库以外,相互之间是完全独立的.

Connector.Connector模块负责接受来自网络客户端的请求,并将请求的处理结果反馈给客户端.每个Connector实例实际上实现的是一种网络传输协议,它将通过这种协议传入的客户端请求进行分析,构造相应的Request和Response实例,找出适合相应该请求的 Container实例,调用该Container的invoke方法,并将Request和Response实例作为参数传入,最终将处理结果或者错误信息反馈给客户端.

Engine.Engine是Container的子接口,它代表了整个Servlet引擎.在运行中,Engine永远是Container层次结构的最高级,所以,其setParent()方法若如被调用将总是抛出 IllegalArgumentException异常.一个Engine的子Container通常是一个或多个的Host实例.

Host.Host 代表的实际上就是常说的“虚拟主机”的概念.在一个Tomcat Web服务器中可以同时运行多个Host,每个Host都与一个特定的主机名以及任意个“别名”相绑定.每个客户端的请求都会根据主机名映射到相应的 Host进行处理.Host的下级Container通常是一些Context实例.

Context.一个Context就是一个独立的Web应用.它包括了Web应用的所有Servlet类、JSP 文件、静态页面和图片、Jar包、环境变量、各种配置参数以及其他各种资源.Context的下级Container通常是Wrapper的实例。

No comments: