阅读 176

Tomcat连接器(tomcat连接器的三种方式)

Tomcat架构图:

image.png

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。

image.png

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的性能。

连接器组件

image.png

连接器中的各个组件的作用:

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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐