《看透springMVC源码》之Connector分析

本文详细分析了Tomcat的Connector组件,包括其结构、ProtocolHandler、Endpoint、Processor和Adapter的角色。Connector使用ProtocolHandler处理不同类型的连接,如Http11NioProtocol,实现了TCP/IP和HTTP协议。Endpoint负责网络连接,Processor封装Socket为Request,Adapter则将Request传递给Servlet容器处理。整个请求流程从接收Socket到返回响应给客户端,涉及多个层次的交互和协议处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Connector用于接收请求并将请求封装成Request和Response来具体处理,最底层是使用Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时实现了TCP/IP协议和HTTP协议,Request和Response是按照HTTP协议来封装的,所以Connector同时实现了TCP/IP协议和HTTP协议,Request和Response封装完之后交给Container进行处理,Container就是Servlet的容器,Container处理完之后返回给Connector,最后Connector使用Socket将处理结果返回给客户端,这样整个请求就完成了。

Connector的结构

Connector中具体是用ProtocolHandler来处理请求的,不同的ProtocoHandler代表不同的连接类型,比如,Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。
ProtocolHandler里面有3个非常重要的组件:EndPonit、Processor和Adapter。Endpoint用于处理底层Socket的网络连接,Processor用于将EndPoint接收的Socket封装成Request,Adapter用于将封装好的Request交给Container进行具体处理。也就是说Endpoint用来实现TCP/IP协议,Processor用来实现HTTP协议,Adapter将请求设配到Servlet容器进行具体处理。
Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步request的超时,Handler用于处理接收到的Socket,在内部调用了Peocessor进行处理。
这里写图片描述

Connector自身类

Connector类本身的作用主要是在其创建时创建ProtocolHandler,然后在生命周期的相关方法中调用了ProtocolHandler的相关生命周期方法。Connector的使用方法是通过Connector标签配置在conf/server.xml文件中,所以Connector是在Catalina的load方法中根据conf/server.xml配置文件创建Server对象时创建的。Connector的生命周期方法是在Service中调用的。

ProtocolHandler

ProtocolHandler有一个抽象实现类AbstractProtocol,AbstractProtocol下面分了三种类型:Ajp,HTTP和Spdy。
这里写图片描述

这里的ProtocolHandler以默认配置中的org.apache.coyote.http11.Http11NioProtocol为例来分析,它使用HTTP1.1协议,TCP层使用NioSocket来传输数据。
Http11NioProtocolHandler的构造函数中创建了NioEndpoint类型的Endpoint,并新建了Http11ConnectionHandler类型的Handler然后设置到了Endpoint中:

这里写图片描述

四个生命周期方法是在父类AbstractProtocl中实现的,其中主要调用了Endpoint的生命周期方法。

处理TCP/IP协议的Endpoint

Endpoint用于处理具体连接和传输数据,NioEndpoint继承自org.apahce.tomcat.util.net.AbstractEndpoint,在NioEndpoint中新增了Poller和SocketProcessor内部类,NioEndpoint中处理请求的具体流程如下:
这里写图片描述

处理HTTP协议的Processor

Processor用于处理应用层协议(如HTTP),它的继承结构如图:

这里写图片描述

Processor有两个AbstractProtocol抽象继承类,图中上面的AbstractProtocol是在org.apache.coyote.http11.update包中,下面的AbstractProtocol在org.apache.coyote包中。正常处理协议使用的是下面的AbstractProtocol及其实现类,上面的AbstractProtocol是Servlet3.1之后才新增的,用于处理HTTP的升级协议,当正常(下面)的Processor之后如果Socket的升级状态是UPGRADING,那么Endpoint中的Handler将会接着创建并调用org.apache.coyote.http11.update包中的Processor进行处理,这里的HTTP升级协议指的是WebSocket协议。
图下方org.apache.coyote包中的Processor和前面介绍过的ProtocolHandler一一对应,具体实现应用层协议处理请求的是AbstractAjpProcessor和AbstractHttp11Processor中的process方法,这个方法中首先封装了Request和Response,然后调用Adapter将请求传递到了Container中,最后对处理的结果进行了处理,如有没有启动异步处理、处理过程中有没有抛出异常等。

适配器Adapter

Adapter只有一个实现类,那就是org.apache.catalina.connector包下的CoyoteAdapter类。Processor在其process方法中会调用Adapter的servie方法来处理请求,Adapter的service方法主要是调用Container管道中的invoke方法来处理请求,在处理之前对Request和Response做了处理,将原来创建的org.apache.coyote包下的Request和Response封装成了org.apache.catalina.connector的Request和Response,并在处理完成之后判断是否启动了Comet(长连接推模式)和是否启动了异步请求,并作出相应处理。调用Container管道的相应代码如下:

这里写图片描述

Service中保存的是最顶层的容器,当调用最顶层容器管道的invoke方法时,管道将逐层调用各层容器的管道中Value的invoke方法,直到最后调用Wrapper的管道中的BaseValue(StandardWrapperValue)来处理Filter和Servlet。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值