tomcat6源码分析一(核心模块分析)

本文以tomcat6源码为基础,主要分享如下内容:

  1. tomcat总体架构
  2. tomcat核心模块分析

本文主要目的是梳理清楚tomcat有哪些核心模块以及这些模块之间的关系。文章使用类图阐述这些内容。

总体架构

Tomcat是目前非常流行的web容器,tomcat总体架构见下图。

图1 Tomcat总体架构图

  • Tomcat最外层是一个Server模块,它控制整个tomcat的生命周期。
  • Server由多个Service组成,一个Service是一个对外服务的实体。
  • Service由多个Connector、一个Container、一个Executor和其它基础服务模块组成。
  • 其中Connector和Container是tomcat的核心模块,也是本文要重点剖析的模块。Executor是提供一个线程池,如果在Server.xml中没有配置,则tomcat启动时候会分配一个默认的线程池。

        Connector好比酒店前台接待人员,Container好比一个酒店房间、床铺等硬件设施,一个酒店可以有多类不同职能的接待人员。比如:有的专职为vip客户服务,有的专职为普通用户服务,有的为领导干部服务等。同样在Server.xml中也可以配置不同类型的Connector,比如:<Connectorport="8081" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"maxThreads="2" acceptCount="1024"/> 这个Connector监听8081端口,专职为HTTP/1.1类型请求服务;<Connectorport="8009" protocol="AJP/1.3" redirectPort="8443" /> 这个Connector监听在8009端口,专职为AJP/1.3类型请求服务。

        一座酒店整体配套设施好比Container,当这些硬件配套设置准备好之后,前台工作人员准备到位后便可对外提供服务。前台工作人员和硬件配套设置组合在一起就形成了一个可以对外服务的实体(Service)。Server好比一个酒店连锁,service就是一个个连锁酒店实体。

图2 Server.xml配置

上图是一个简单Server.xml配置。这里需要提到的是Valve模块,它对整个Engine容器起作用,相当于一个阀门,所有被Egine处理的请求都会被先调用Valve.invoke()。有关Valve处理流程在后面会有详细介绍。

tomcat核心模块分析

Tomcat模块化、面向接口编程使得其拥有很好的扩展性。本节主要通过类图剖析tomcat核心模块和模块之间的关系。

图3  tomcat整体类图结构

Server接口

图4 Server接口

从Server接口定义可以很清晰看到Server的主要功能。

  • setPort设置监听端口,StandardServer实例化 ServerSocket,在此端口监听用户发来的停止请求。
  • getShutdown接口获取停止server的命令字符串。如:server.xml中配置<Serverport="8005" shutdown="SHUTDOWN">,这个接口将返回“SHUTDOWN”。用户可以向8005端口发送“SHUTDOWN”字符串停止tomcat。
  • Server维护一个Service列表,可以添加、删除、查找一个Service。

Service接口

图5 Service接口

通过接口定义(setContainer、addConnector、addExecutor)可以看出一个Service对应一个Container、多个Connector、多个Executor。Service把Connector和Container联系在一起,对外提供一个服务实体。

Connector类

在tomcat5中Connector是一个接口,Http11Connector是其中的一个实现。在tomcat6中有所不同,tomcat6中Connector是一个类而不是接口。(本文所研究的是tomcat6.0源码)

图6 Connector类

Connector中主要依赖ProtocalHandler和Adapter两个接口工作。protocol实现类很多,下面举例分析Http11Protocol类。

Http11Protocol类

图7 Http11Protocol类

  • Http11Protocol主要由JIoEndPoint、Http11ConnectionHandler、CoyoteAdapter、ServerSocketFactory组成。
  • 这里最重要的类是JIoEndPoint,它由Acceptor、WokerStack、Executor组成。当Server.xml中没有配置Ececutor时使用WorkerStack线程池,否则使用Executor线程池。
  • Acceptor是Runnable类型,调用serversocket.accept() 监听客户端请求, 并把socket派发给Executor或者WorkerStack的Worker处理。若配置了Executor,则把socket封装到SocketProcessor里派发给Executor,否则派发给Worker处理。
  • Socketprocessor或者Woker都调用Http11ConnectionHandler.process函数处理socket。

上面简单介绍了socket接入流程,后面tomcat启动和工作流程部分会详细介绍socket的接入和处理流程。(这部分内容见tomcat6源码分析后续文章)

Http11ConnectionHandler类

图8 Http11ConnectionHandler类

一个socket处理流程: Worker或者SocketProcessor .process(socket)  -> Http11ConnectionHandler.process(socket)  ->  Http11Processor.process(Socketsocket) -> 封装inputstream/outputstream、设置socket相关参数 ->CoyoteAdapter.service(request, response)。至此的请求处理逻辑进入到了CoyoteAdapter中。

CoyoteAdapter类

图9 CoyoteAdapter类

到此connector模块完成了请求接收、参数解析、最后把处理任务交接给了Container。

Container组件

图10 Container接口

Container下面有四个子接口Egine、Host、Context、Wrapper,前面依次是后面的父容器。

这四个容器分别对应Server.xml中配置。

图11 Server.xml配置

注意这里Engine容器中有个Valve配置。它何时起作用?起到什么作用?这些问题在接下来分析tomcat处理流程的文章中时会详细讲到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值