Tomat6的整体架构

在上篇文章中,我们已经成功将Tomcat6.0 的源代码导入到 Eclipse IDE 中。现在我们就开始学习 Tomcat 源码。 Tomcat 源代码共有 1000 多个 java 类,代码行数大约 28 万到 30 万行左右。从项目规模上说,可算得上是一个中型项目。要学习理解 Tomcat 源代码,我们有多种办法可行。最原始的一种办法就是,打开 Debugger ,逐行跟踪,看看 Tomcat 如何启动,如何处理客户端请求,如何编译动态 jsp 页面。第二种办法是利用逆向工程,把 Tomcat 的总体类图先描绘出来,然后再结合 sequence diagram ,来学习理解它。我们在这里采取从顶到底的阅读方法,先了解整体架构,然后逐步细化。所谓“纲举目张”,说的就是这个道理。

首先,我们可以从功能的角度将 Tomcat 源代码分成 5 个子模块,它们分别是:

1)   Jsper 子模块

这个子模块负责 jsp 页面的解析, jsp 属性的验证,同时也负责将 jsp 页面动态转换为 java 代码并编译成 class 文件。在 Tomcat 源代码中,凡是属于 org.apache.jasper 包及其子包中的源代码都属于这个子模块;


2)   Servlet 和 Jsp 规范的实现模块

这个子模块的源代码属于 javax.servlet 包及其子包,如我们非常熟悉的 javax.servlet.Servlet 接口、 javax.servet.http.HttpServlet 类及 javax.servlet.jsp.HttpJspPage 就位于这个子模块中;


3)   Catalina 子模块

这个子模块包含了所有以 org.apache.catalina 开头的 java 源代码。该子模块的任务是规范了 Tomcat 的总体架构,定义了 Server 、 Service 、 Host 、 Connector 、 Context 、 Session 及 Cluster 等关键组件及这些组件的实现,这个子模块大量运用了 Composite 设计模式。同时也规范了 Catalina 的启动及停止等事件的执行流程。从代码阅读的角度看,这个子模块是我们阅读和学习的重点。


4)   Connectors 子模块

如果说上面三个子模块实现了 Tomcat 应用服务器的话,那么这个子模块就是 Web 服务器的实现。所谓连接器 (Connector) 就是一个连接客户和应用服务器的桥梁,它接收用户的请求,并把用户请求包装成标准的 Http 请求 ( 包含协议名称,请求头 Head ,请求方法是 Get 还是 Post 等等 ) 。同时,这个子模块还按照标准的 Http 协议,负责给客户端发送响应页面,比如在请求页面未发现时,connector就会给客户端浏览器发送标准的 Http 404 错误响应页面。

Tomcat 实现了两类连接器,除了上述实现了 Http1.1 协议的 Coyote 连接器外,还有一种 JK 连接器,JK 连接器是将Tomcat 和第三方 Web 服务器 ( 如 Apache 或 IIS Web 服务器 ) 连接起来, Tomcat 此时充当应用服务器的角色,负责处理和解释 Jsp 及 Servlet 请求。

Coyote 连接器的源代码位于以 org.apache.coyote 开头的包中, JK 连接器的代码位于以 org.apache.jk 开头的包中。

另外, Tomcat 虽然实现了 Web 服务器的功能,但是其实现不是非常完美,效率不高,所以在生产环境中,我们通常要将 Tomcat 和 Apache Web Server 配合使用,尽量利用它们各自的优势。


5)   Resource 子模块

这个子模块包含一些资源文件,如 Server.xml 及 Web.xml 配置文件。严格说来,这个子模块不包含 java 源代码,但是它还是 Tomcat 编译运行所必需的。


上面我们从模块组件的角度,简单介绍了 Tomcat 的子模块划分及其相应的功能。下面我们简单以图示意之。




从上面的Tomcat 子模块示意图中,我们可以看到,来自客户端的请求首先由 Connector 子模块进行处理,然后根据情况或者发送到第三方的 Web 服务器,或者转发到 Jsper 模块进行处理,或者转发到 Jsp/Servlet 子模块处理。总体说来, Tomcat 通过下面三种方式处理来自客户端的请求:

(1)   如果客户端发出静态页面请求,如果没有配置第三方 Web 服务器,此时客户端的请求直接交由 Coyote Connector 子模块处理,然后返回结果;如果配有第三方应用服务器,那么客户的请求直接由第三方应用服务器响应,然后返回静态记过页面。客户端请求的执行过程如图中绿线所示。


(2)   如果客户端请求 Jsp 页面,该请求首先转发到发送 Coyote 连接器 ( 在没有配置第三方 Web 服务器的情况下 ) ,或者经过第三方 Web 服务器将客户请求转发到 JK 连接器;然后该 Jsp 请求将交给 Jsper 子模块处理, Jsper 将根据情况验证编译该 Jsp 页面,最后由 Jsp/Servlet 模块对客户请求进行处理。 Jsp 请求处理完毕,服务器首先把响应结果发送给连接器子模块,连接器子模块根据情况或将响应结果页面发送到第三方 Web 服务器,或者直接发送响应结果页面到客户端。


(3)   如果客户请求 Servlet , Tomcat 的处理流程和 Jsp 页面的请求执行流程基本类似,只不过少了一个 Jsper 子模块处理罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值