从连接器组件看Tomcat的线程模型——连接器简介

Connector组件介绍

Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责是负责接收客户端连接和客户端请求的处理加工。每个Connector都将指定一个端口进行监听,分别负责对请求报文解析和对响应报文组装。

Connector组件是整个Tomcat的入口,假如我们想要学习Tomcat的源码的话,建议从Connector组件开始看起。

还有一个比喻就是Tomcat是一座城堡,而Connector组件就是这座城堡的一个个城门。

从连接器组件看Tomcat的线程模型——连接器简介

上图是Connector组件的一个典型实现,其包含Protocol组件、Mapper组件和CoyoteAdaptor组件。

Protocol组件是协议的抽象,它将不同通信协议的处理进行了封装,比如HTTP协议和AJP协议(目前Tomcat只支持这两种协议)。Endpoint是接收端的抽象,由于使用了不同的I/O模式,因此存在多种类型的Endpoint,如BIO模式的JIoEndpoint、NIO模式的NioEndpoint和本地库I/O模式的AprEndpoint。Acceptor是专门用于接收客户端连接的接收器组件,Executor则是处理客户端请求的线程池, Connector可能是使用了Service组件的共享线程池,也可能是Connector自己私有的线程池。Processor组件是处理客户端请求的处理器,不同的协议和不同的I/O模式都有不同的处理方式,所以存在不同类型的Processor。

Mapper组件可以称为路由器,它提供了对客户端请求URL的映射功能,即可以通过它将请求转发到对应的Host组件、Context组件、Wrapper组件以进行处理并响应客户端,也就是我们常说的将某客户端请求发送到某虚拟主机上的某个Web应用的某个Servlet

CoyoteAdaptor组件是一个适配器,它负责将Connector组件和Engine容器适配连接起来。把接收到的客户端请求报文解析生成的请求对象和响应对象Response传递到Engine容器,交由容器处理。

连接器支持的协议以及对应的IO模型

上面简单提到Tomcat暂时支持HTTP和AJP两种协议,对于每种协议又会有不同的IO模型,所以会有以下组合。

对于Http协议,Tomcat支持以下四种IO模型:

Http11Protocol:传统的BIO模型,对应的类为org.apache.coyote.http11.Http11Protocol

Http11NioProtocol:NIO模式,对应的类为org.apache.coyote.http11.Http11NioProtocol

Http11AprProtocol:Apr模式,对应的类为org.apache.coyote.http11.Http11AprProtocol

Http11Nio2Protocol:AIO模式,对应的类是org.apache.coyote.http11.Http11Nio2Protocol

描述 配置方法 server.xml
NIO   同步非阻塞,比传统BIO能更好的支持大并发,tomcat 8.0 后默认采用该模式   改为 protocol="org.apache.coyote.http11.Http11NioProtocol"  
BIO   阻塞式IO,tomcat7之前默认,采用传统的java IO进行操作,该模式下每个请求都会创建一个线程,适用于并发量小的场景   protocol =" org.apache.coyote.http11.Http11Protocol"  
APR   tomcat 以JNI形式调用http服务器的核心动态链接库来处理文件读取或网络传输操作,需要编译安装APR库(也就是说IO操作的部分直接调用native代码实现)   protocol ="org.apache.coyote.http11.Http11AprProtocol"  
AIO   异步非阻塞 (NIO2),tomcat8.0后支持。多用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂   protocol ="org.apache.coyote.http11.Http11Nio2Protocol"  

需要注意的是:上面四种IO模型的连接器我们可以同时配置使用,只要他们监听不同的端口就行了。

对于Ajp协议,Tomcat也支持下面几种IO模型:

AjpProtocol:对用传统的BIO

AjpNioProtocol:对应NIO

AjpAprProtocol:对应Apr模式

AjpNio2Protocol:对应AIO模式

这几种模式和上面的模式只是协议上的区别,我们可以重点学习Http协议的实现,毕竟这是我们平时开发中更加常用的实现。

关于AJP协议这边做下简单的介绍。

Tomcat最主要的功能是提供Servlet/JSP容器,尽管它也可以作为独立的Java Web服务器,它在对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器,如IIS和Apache的服务器。

因此在实际应用中,常常把Tomcat的与其他HTTP服务器集成。对于不支持的Servlet/JSP的HTTP服务器,可以通过的Tomcat服务器来运行的Servlet/JSP组件,而对于静态资源的处理还是在原来的Web服务器中处理。

Apache服务器和Tomcat的连接通信就可以通过AJP协议通信。

从连接器组件看Tomcat的线程模型——连接器简介

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxsyz.html