Tomcat Connector组件

来源:互联网 发布:2013版excel数据在哪里 编辑:程序博客网 时间:2024/04/28 06:47

转载地址:http://www.goldendoc.org/2010/12/tomcat_connector/

Tomcat Connector是Tomcat中的一个重要的组件,它负责监听到达Tomcat的请求,并将这些 请求转换成Servlet规范中所定义的Request,然后将转换后的请求交给Engine组件去处理,最后将Engine返回的Response返回给客户端。

一、Connector组件的主要请求处理类以及它们的功能

在了解Connector组件的大致功能之后,我们来看一下Connector组件里面的一些主要的类以及它们的职责,然后在后面的内容中,我们会讲述这些类是如何协同工作以完成Connector组件的功能的,下面是一张Connector组件中主要的类的类图(这里面并没有画出它们之间的关系,因为感觉没有太大的意义):



在上面的这一张图中:

  • EndPoint:从名字上可以看出,这个类代表的是一个Socket连接的一个端点,它主要负责接收所有到达的请求。
  • ProtocalHandler:这个接口的实现类是Tomcat对各种协议的实现,包括Http11ProtocalHttp11NioProtocal等等
  • ConnectionHandler:这个类负责的主要工作是将接受到的请求交给RequestProcessor处理。
  • RequestProcessor:这个类负责的是根据不同的协议来实现对请求的处理。
  • Adapter:这个类看名字负责的就是适配器的工作,实际上它负责的工作是通过适配的方式来将Connector组件和Engine组件给连起来,说到这里,聪明的你一定有一个疑问,那么它到底将什么东西做了适配呢?这里我们先卖个关子,等到介绍到了Connector组件的再来说明这个问题。

二、Connector组件中RequestResponse相关的类

Connector中,对于RequestReponse,分别有三种:CoyoteCatalinaFacade,我们来看下它们之间有什么区别:

  • Coyote:这一对Requestorg.apache.coyote.Request)和Reponseorg.apache.coyote.Response)是专门用于Tomcat的内部表示的,和Servlet规范无关
  • Catalina:这一对Requestorg.apache.catalina.connector.Request)和Responseorg.apache.catalina.connector.Response)实现了Servlet规范。到这里,聪明的读者一定已经想到,我们在上面提到的Connector的工作就是将Coyote的那对RequestResponse适配成Catalina下的那对RequestResponse
  • Facade:这一对Requestorg.apache.catalina.connector.RequestFacade)和Responseorg.apache.catalina.connector.ResponseFacade)从名字上看一看出就是一个门面,它们的作用是做Catalina那对RequestResponse的门面,从Catalina那对的RequestReponse的源代码中我们可以看到,这一对RequestResponse虽然实现了Servlet规范,但是另外还有一些其他一些public方法,这些方法如果直接暴露给Web应用,显然是不合适的,所以就加了这么一层门面,只暴露出去Servlet规范里面所定义的方法。

三、Connector组件对请求的处理过程

在了解了Connector组件的一些主要的类以及它们的职责以后,我们以Http11为例来看写这些类是如何协同起来来对请求进行处理的,下面这张图简单的画了一下整个请求的处理过程:


[点击查看大图]

我们可以看到:

  1. Tomcat启动的时候,JioEndpointAcceptor阻塞在Socket.accept()系统调用中,等待连接的进入。
  2. 一旦接收到了一个连接,Acceptor便从WorkerStack中取出一个Worker并将Socket交给Worker去处理
  3. Worker拿到Socket以后将这个Socket交给了ConnectionHandler处理
  4. ConnectionHandler接着从recycledProcessors中取出一个RequestProcessor,并把请求交给它去处理
  5. 这个时候,这个Socket已经到了RequestProcessor手上了,RequestProcessor就负责将Socket转换成CoyoteRequestCoyoteResponse,最后将请求交给了Adapter来处理。
  6. 最后,请求到了Adapter这里,Adapter接受到的参数仍然不是Servlet规范所定义的RequestResponseAdapter的工作就是将CoyoteRequestCoyoteResponse转换成Servlet请求所定义的RequestResponse,并将这个RequestResponse交给Engine去处理。

这是一个大致的Connector对请求的处理过程,当然,实际上的处理过程要比这个复杂的多,但是这么一个简化的过程对我们理解这些类的工作还是很有帮助的。

看完上面的处理过程后,读者可能会有一个疑问,实际上Connector在处理请求的时候维持了两份池,一份是WorkStack,另一份是RecycledProcessors,这两份池到底有什么用呢?先说下WorkStack,它维护的是一份线程池,为了Tomcat能够多线程地处理请求;而recycledProcessors这个池维持的是一份对象池,至于为什么要维护这么一份对象池,我想是为了能够对对象进行重复的利用,大家知道,如果这些对象使用后直接释放必然最后会被虚拟机的垃圾回收器所回收,而垃圾回收必然会对Tomcat的性能造成一定程度的影响,为了尽可能高的提升Tomcat的性能,Tomcat采用了这种对象回收利用的方法,我们在Tomcat的源代码中可以看到,有很多类都有一个recycle方法,用于把这些对象的状态归位,以便于用以处理后续的请求。

四、总结

这篇文章只是很简单地介绍了一下TomcatConnector组件,使大家对TomcatConnector组件有一个感性的认识,知道Connector组件大概是如何工作的。另外,TomcatConnector组件里面还有许多值得我们深入学习的东西,比如Nio的处理,对象的重复利用等等等等,期待大家有深入的学习并且有精彩的分享!


原创粉丝点击