《看透springMVC源码》之Connector分析

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进行处理。
《看透springMVC源码》之Connector分析

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。
《看透springMVC源码》之Connector分析

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

《看透springMVC源码》之Connector分析

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

处理TCP/IP协议的Endpoint

Endpoint用于处理具体连接和传输数据,NioEndpoint继承自org.apahce.tomcat.util.net.AbstractEndpoint,在NioEndpoint中新增了Poller和SocketProcessor内部类,NioEndpoint中处理请求的具体流程如下:
《看透springMVC源码》之Connector分析

处理HTTP协议的Processor

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

《看透springMVC源码》之Connector分析

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管道的相应代码如下:

《看透springMVC源码》之Connector分析

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