Tomcat7.0.42源码研读之网络连接器Connector(三)

来源:互联网 发布:淘宝客服服务流程图 编辑:程序博客网 时间:2024/05/01 18:59


    Tomcat中Connector代表了网络连接器,连接器支持HTTP、AJP协议,还支持多种I/O方式:BIO、NIO、APR。一个Connector应该要做到这几个功能:


     1、监听服务器端口,获取来自客户端的请求

     2、将请求数据按照指定协议进行解析

     3、根据请求地址寻找合适的容器处理

     4、将服务端响应返回给客户端


     基于此,Tomcat给出的设计方案如下:

    


        其中,ProtocolHandler代表了一个协议处理器,它还包含了一个Endpoint用来启动一个Socket监听。在Connector启动时,根据conf/server.xml文件配置的Connector来启动相应的Endpoint来监听服务器端口,并在接收到来自客户端的请求后调用Processor进行数据读取。当Processor读取完客户端请求数据,需要按照请求地址映射到具体容器进行处理,这个过程即为请求映射。Tomcat是通过Mapper和MapperListener两个类来做映射处理的。

       Tomcat是通过适配器模式完成了Connector和Mapper、Container容器的解耦,到此Tomcat整体设计如下:

       


         Tomcat可以在conf/server.xml配置文件中对Connector组件的参数进行设置,配置得当可以做到性能调优:

         

         属性说明maxThreadsTomcat是一款多线程的服务器,每个请求都会分配一个线程进行处理。maxThreads用于指定Connector创建的请求处理线程的最大值。该属性决定了Tomcat可以并发处理的上限,当并发请求数超过这个值的时候,多余的请求只能排队等待maxSpareThreadsTomcat允许的最大空闲线程数目,超出的空闲线程将被直接关闭minSpareThreadsTomcat允许的最小空闲线程数目,也是启动Connector时创建的线程数目,如果空闲线程数小于该值,Tomcat将创建新的线程TcpNoDelay对应TCP的TCP_NO_DELAY选项backlog也可以配置acceptCount参数,这两个参数最终都会被Tomcat映射成backlog参数,文章后面重点讲解下ServerSocket的这个backlog参数maxConnections作用跟maxThreads相同acceptorThreadCount这个参数决定了Tomcat会启动多少个线程用来accept socket请求,默认为1connectionTimeoutTomcat将其映射到Socket的SO_TIMEOUT参数,代表Socket在堵塞读写时,两个TCP包到来的最大间隔时间      

         

   重点知识讲解:

  backlog参数Tomcat会启动一个acceptor线程来进行ServerSocket的accept socket操作,然后交由工作线程池来进行具体的业务处理。对于客户端的一个请求进来,详细流程是这样的:tcp的三次握手建立连接,建立连接的过程中,操作系统维护了半连接队列(syn队列)以及完全连接队列(accept队列),在第三次握手之后,Tomcat收到了来自客户端的ack消息,随后进入establish的状态,然后该TCP连接由syn队列移到accept队列。Tomcat的acceptor线程则负责从accept队列中取出该TCP连接,接受该Socket,然后交给工作线程去处理,然后Tomcat自己接着去accept队列取socket(当当前Tomcat工作线程池处理的socket连接超过maxConnections的时候,acceptor线程自己会阻塞等待,等连接降下去之后,才去处理TCP accept队列的下一个连接)。backlog指的就是这个accept队列的大小                  


      关键代码片段如下:

      




     

原创粉丝点击