0%

tomcat之Coyote

Catalina是Tomcat提供的Servlet容器,负责处理来自客户端的请求并输出响应,但是仅有Servlet容器服务器无法对外提供服务,还需要由链接器接收来自客户端的请求,并按照既定协议进行解析,然后交给Servlet容器处理。

Coyote

Coyote是Tomcat链接器框架的名称,是Tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接收响应。

Coyote封装了底层的网络通信(Socket请求和响应),为Catalina容器提供了统一的接口,使Catalina容器与具体的请求协议及I/O方式解耦。Coyote将Socket输入转换为Request对象,交由Catalina容器进行处理,处理完成后,Catalina通过Coyote提供的Response对象将结果写入到输出流

Coyote中,Tomcat支持3种传输协议

  • HTTP/1.1 主要用于Tomcat单独运行(不与Web服务器集成)的情况

  • AJP协议 用于和Web服务器集成,以实现针对静态资源的优化以及集群部署

  • HTTP/2.0 新的HTTP协议(Tomcat8.5之后开始支持)

针对HTTP和AJP协议,Coyote又按照I/O方式提供了几种方案(8.5之后移除了对BIO的支持)

  • NIO 采用Java NIO类库实现
  • NIO2 采用JDK7中最新的NIO2实现
  • APR 采用APR实现。是使用C/C++编写的本地库,如果选择该方案,需要单独安装APR库

Connector核心概念

Endpoint

Coyote通信端点,即通信监听的接口,是具体的Socket接收处理类,是对传输层的抽象。AbstractEndpoint抽象类,对于不同的I/O方式有不同的子类,NioEndpoint(NIO)、AprEndpoint(APR)以及Nio2Endpoint

Processor

Coyote协议处理接口,负责构造Request和Response对象,并通过Adapter将其提交到Catalina容器处理,是对应用层的抽象。Processor是单线程的,Tomcat在同一次链接中复用Processor。

ProtocolHandler

Coyote协议接口,通过封装Endpoint和Processor,实现针对具体协议的处理功能。

UpgradeProtocol

Tomcat采用UpgradeProtocol接口表示HTTP升级协议,当前只提供了一个实现用于处理HTTP2.0