Tomcat连接器(tomcat连接器的三种方式)
Tomcat架构图:
Connector作用
Connect(连接器)负责接收外部连接请求,创建Request、Response对象用于请求的数据交换,并分配线程让Container处理该请求。
Connector可以支持多种协议的请求(如HTTP,AJP等)的请求,对Connector的配置在conf/server.xml中。
Coyote是Tomcat的连接器框架的名称, 是Tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接受响应。
Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina提供了统一的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。
Coyote将Socket输入转换封装为Request对象,交由Catalina容器进行处理,处理请求完成后, Catalina通过Coyote提供的Response对象将结果写入输出流。
Coyote作为独立的模块,只负责具体协议和IO的相关操作,与Servlet规范实现没有直接关系,因此Request和Response对象并未实现Servlet规范对应的接口,而是在Catalina容器中将他们进一步封装为ServletRequest和 ServletResponse。
IO模型
Tomcat 支持的IO模型(自8.5/9.0 版本起,Tomcat 移除了对 BIO 的支持)
NIO:非阻塞I/O,采用Java NIO类库实现。
NIO2:异步I/O,采用JDK7最新的NIO2类库实现。
APR:采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库。
应用层协议
HTTP/1.1:这是大部分Web应用采用的访问协议。
AJP:用于和Web服务器集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3。
HTTP/2:HTTP 2.0大幅度的提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。
在8.0之前 ,Tomcat默认采用的I/O方式为BIO,之后改为NIO。无论NIO、NIO2还是APR,在性能方面均优于以往的BIO。如果采用APR,甚至可以达到Apache HTTP Server的性能。
连接器组件
连接器中的各个组件的作用:
EndPoint
EndPoint:Coyote通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。
Tomcat并没有EndPoint接口,而是提供了一个抽象类AbstractEndpoint,里面定义了两个内部类:Acceptor和SocketProcessor。
Acceptor用于监听Socket连接请求。
SocketProcessor用于处理接收到的Socket请求,它实现Runnable接口,在Run方法里调用协议处理组件Processor进行处理。 为了提高处理能力,SocketProcessor被提交到线程池来执行。
Processor
Processor:Coyote协议处理接口,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议。
Processor接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理。
Processor是对应用层协议的抽象。
ProtocolHandler
ProtocolHandler:Coyote协议接口,通过Endpoint和Processor,实现针对具体协议的处理能力。
Tomcat按照协议和I/O提供了6个实现类:AjpNioProtocol,AjpAprProtocol,AjpNio2Protocol,Http11NioProtocol,Http11Nio2Protocol,Http11AprProtocol。
我们在配置tomcat/conf/server.xml时,至少要指定具体的ProtocolHandler,当然也可以指定协议名称。
如:HTTP/1.1,如果安装了APR,那么将使用Http11AprProtocol,否则使用Http11NioProtocol。
Adapter
由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来“存放”这些请求信息。
ProtocolHandler接口负责解析请求并生成Tomcat Request类。
但是这个Request对象不是标准的ServletRequest,也就意味着,不能用Tomcat Request作为参数来调用容器。
Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Sevice方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器的Service方法。
作者:未来的我2025
链接:https://juejin.cn/post/7031074672993108005