配置与配置项
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
tomcat中connector配置如上,如何处理来访是由protocol属性决定的,对HTTP协议而言,这个属性可以配置的值有:
- HTTP/1.1
- org.apache.coyote.http11.Http11Protocol –BIO实现
- org.apache.coyote.http11.Http11NioProtocol –NIO实现
- 定制
配置“HTTP/1.1”和“org.apache.coyote.http11.Http11Protocol”的效果是一样的,因此connector的HTTP协议实现缺省是支持BIO的。无论是BIO还是NIO都是实现一个org.apache.coyote.ProtocolHandler接口,如果需要定制化,也必须实现这个接口。
消息流
模块解释
三大模块: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的消息流