tomcat架构:Connector

配置与配置项

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

tomcat中connector配置如上,如何处理来访是由protocol属性决定的,对HTTP协议而言,这个属性可以配置的值有:

  1. HTTP/1.1
  2. org.apache.coyote.http11.Http11Protocol –BIO实现
  3. org.apache.coyote.http11.Http11NioProtocol –NIO实现
  4. 定制

配置“HTTP/1.1”和“org.apache.coyote.http11.Http11Protocol”的效果是一样的,因此connector的HTTP协议实现缺省是支持BIO的。无论是BIO还是NIO都是实现一个org.apache.coyote.ProtocolHandler接口,如果需要定制化,也必须实现这个接口。

消息流

tomcat架构:Connector_第1张图片

模块解释

三大模块:Http11Protocol、Mapper、CoyoteAdapter,分别说一下

Http11Protocol

三个部分:Acceptor、Worker、Http11Processor。
Acceptor:Acceptor接收socket,然后从Worker线程池中获取空闲的线程处理socket,如果Worker线程池中没有空闲线程,Acceptor间被阻塞(这既是所谓的BIO,而NIO在此处的处理则是多了一个队列events queue和一个轮询线程Poller,Acceptor接收到socket后,最终会将请求封装成一个PollerEvent对象,并将该对象压入队列events queue,Poller线程中不断的扫描队列,如果有新的PollerEvent对象,则获取其中的socket,并从worker线程池中拿到可用的Worker线程进行处理,典型的生产者消费者模式,Acceptor线程为生产者,Poller为消费者,这样的话Acceptor线程就不会被阻塞,也就是NIO非阻塞,简单理解下吧)。

Worker:Worker线程拿到socket,就从Http11Processor对象池中获取Http11Processor对象进行处理,Http11Processor将调用CoyoteAdapter进行处理

CoyoteAdapter

此对象负责将http request解析成HttpServletRequest对象,然后执行

connector.getContainer().getPipeline().getFirst().invoke(request, response);

connector的容器使StandardEngine,由此请求已经交由Container处理,由代码可以看到pipeline valve的起点就是Adapter。

Mapper

保存http request到servlet的映射,用于快速定位servlet。

最后再放一张NIO的消息流

tomcat架构:Connector_第2张图片

你可能感兴趣的:(tomcat)