0%

tomcat之Connector

Connector连接器

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

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

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

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

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

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

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

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

Connector结构

Connector结构

ProtocolHandler

Connector协议接口,通过封装Endpoint和Processor,实现针对具体协议的处理功能。使用ProtocolHandler来处理请求,不同的ProtocolHandler表示不同的连接类型,如Http11NioProtocol、Http11AprProtocol等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Connector中设置协议
public void setProtocol(String protocol) {

boolean aprConnector = AprLifecycleListener.isAprAvailable() &&
AprLifecycleListener.getUseAprConnector();

if ("HTTP/1.1".equals(protocol) || protocol == null) {
if (aprConnector) {
setProtocolHandlerClassName("org.apache.coyote.http11.Http11AprProtocol");
} else {
setProtocolHandlerClassName("org.apache.coyote.http11.Http11NioProtocol");
}
} else if ("AJP/1.3".equals(protocol)) {
if (aprConnector) {
setProtocolHandlerClassName("org.apache.coyote.ajp.AjpAprProtocol");
} else {
setProtocolHandlerClassName("org.apache.coyote.ajp.AjpNioProtocol");
}
} else {
setProtocolHandlerClassName(protocol);
}
}

根据不同的协议来实例化不同的ProtocolHandler对象

1
2
3
4
5
6
7
8
9
10
ProtocolHandler p = null;
try {
Class<?> clazz = Class.forName(protocolHandlerClassName);
p = (ProtocolHandler) clazz.getConstructor().newInstance();
} catch (Exception e) {
log.error(sm.getString(
"coyoteConnector.protocolHandlerInstantiationFailed"), e);
} finally {
this.protocolHandler = p;
}
Endpoint

Connector通信端点,即通信监听的接口,是具体的Socket接收处理类,是对传输层的抽象,用来处理底层Socket的网络连接。AbstractEndpoint抽象类,对于不同的I/O方式有不同的子类,NioEndpoint(NIO)、AprEndpoint(APR)以及Nio2Endpoint,相当于实现了TCP/IP协议

Processor

Connector协议处理接口,负责将Endpoint接收到的Socket封装成Request,并通过Adapter将其提交到Container容器处理,是对应用层的抽象。Processor是单线程的,Tomcat在同一次连接中复用Processor。相当于实现了HTTP协议

Adapter

Adapter用于将封装好的Request交给Container进行具体的处理,将请求适配到Servlet容器进行具体的处理