Connector 属于 StandardService 里的一个组件,能够在 server.xml 中配置,指定协议、端口、超时时间等。git
1 2 3 4 |
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> </Service> |
每一个 Service 里能够配置多个 Connector. Tomcat 的 Connector 支持两种协议,HTTP 和 AJP. 关于这两种协议,官方文档如此说:github
经过配置不一样的 protocol 属性,可使用不一样的 ProtocalHandler. 配置HTTP/1.1时,默认会使用org.apache.coyote.http11.Http11NioProtocol. 也能够经过指定类名的方式来配置,好比
protocol=”org.apache.coyote.http11.Http11Nio2Protocol”.
针对 HTTP 和 AJP 两种协议,都有 BIO/NIO/NIO2/APR 四种处理方式。web
AJP 的处理我并无去细看,但大的代码结构基本和 HTTP 的处理相似。后面重点看下 HTTP 1.1 链接的几种处理方式(我看的这个版本还不支持Http 2.0)。apache
使用的是Java BIO 技术,一个 Acceptor 线程负责建立链接,把创建好链接的 socket 给到 SocketProcessor, 而后把SocketProcessor 丢到线程池里去执行。通过一系列处理后最终到达 CoyoteAdapter. 线程模型即:编程
使用的是Java NIO 技术,一个 Acceptor 线程负责建立链接,把创建好链接的 socket 交给 一个Poller. 这里有多个Poller,每一个Poller一个线程。Poller 负责把 socket 注册到 selector, 负责轮询 selector(关于selector, 我当年给NetX协议栈写 BSD SOCKET 兼容接口的时候还亲自实现过,哈哈), 有数据可读的时候,就交给SocketProcessor丢到线程池里去执行。通过一系列处理后最终到达 CoyoteAdapter. 线程模型即:tomcat
使用的是 Java NIO2(AIO) 技术,一个 Acceptor 线程(代码里 Acceptor 只支持建立多个的,经过变量 acceptorThreadCount 来控制)负责建立链接,把创建好链接的 socket 给到 SocketProcessor, 而后把SocketProcessor 丢到线程池里去执行。 线程模型即:网络
是否是看起来和 HTTP BIO 很像,可是这里的 read/write 用的是 NIO2 的异步非阻塞方式,即read的时候带个callback,等有OS有数据了,再来回调你的处理方法,效率比BIO高不少。app
APR ,讲真,没仔细研究过,就不瞎BB了。异步
关于BIO/NIO/NIO2(AIO),已及网络编程的线程模型,更详细的能够看Netty学习笔记. 关于这几种模式的性能比较,网上也有不少测试数据。socket
如前面几张图所示,整个链接器的代码结构仍是很清晰的。在 Tomcat 启动的时候,经过 Digest 解析 server.xml 配置的时候,会在 StandardService 里建立一些 Connector. Connector 也是实现生命周期接口的,在 StandardService 初始化和启动的时候,Connector 也会完成本身的初始化和启动操做,启动过程当中,EndPoint 会去完成 bind 操做,而后启动 accept 线程。ProtocalHandler、EndPoint、ConnectionHandler、Processor、Adaptor 这几个角色互相配合,完成各自的工做。
最后,谢晞鸣在想,CoyotoAdapter 这个适配器以前的全部这些的网络处理,是否是均可以用Netty来实现呢,抽空想一想看?
.
以上皆是阅读源码 https://github.com/fdx321/tomcat8.0-source-research 所得