1、Connector分析
Conector用于接受请求并将请求封装成Request和Response,最底层采用Sockert来进行连接的,Request和Response是按照HTTP协议进行封装的。所以Conncetor同时实现了 TCP/IP和HTTP协议,Request封装完了交给Container处理,处理完了返回个Connector,最后Connector处理后封装Response,使用Socket把处理结果返回给客户端,这样整个请求就处理完了。
2、Connector结构
先上图:
2.1 ProtocolHandler Connector中具体使用ProtocolHandler来处理请求,不同的ProtocolHandler代表不同的类型,比如HTTP11Protocal使用的普通Socket来连接的。HTTP11NioProtocol使用NioSocket来连接的。
2.2 ProtocolHanler 包含三个组件Endpoint 、Processor、Adapter
Endpoint用于处理底层的Socket的网络连接---------------------用来实现TCP/IP协议
Processor用于将Endpoint接收到的Socket封装成request------用来实现HTTP协议
Adapter用于将封装好的Request交给Container处理------------将请求适配到Servlet容器进行具体处理
2.2.1 Endpoint的抽象实现AbstractEndPoint定义了Acceptor和AsyncTimeout和一个Handler接口
Acceptor用于监听请求
AsyncTimeout用于检查异步reqeust的超时
Handler用于处理接收到的Socket,在内部调用Processor进行处理
3. Connector自身的类解析
Connector的生命周期是在Service中调用的,Connector的使用方法是通过conf/server.xml文件配置的,所以Connector是在Catalina的load方法中根据conf/server.xml配置文件创建Server对象创建的。
Connector的创建过程主要是为了初始化ProtocolHandler,Connctor的生命周期方法调用了ProtocolHandler的生命周期的方法
3.1 ProtocolHandler
它有一个抽象实现类AbstractProtocol,这个抽象类分为三种类型Ajp、HTTP、Spdy.
注:Ajp是Apache JServ Protocol的缩写,Apache的定向包协议,主要用于前端服务器进行通信,他是长连接,不需要每次通信都重新建立连接,这样节省开销
spdy是Google开发的协议,作用类似于HTTP,比HTTP效率高。不过这是Google定制的企业级协议,使用并不广泛,而且在HTTP/2协议中已经包含了spdy所提供的优势,所以这个协议使用较少,不过Tomcat提供了支持。
默认配置中ProtocolHandler默认是HTTP11NioProtocol,使用HTTP1.1协议,TCP采用NioSocket来传输数据。
3.1.1 EndPoint
EndPoint用于处理具体连接和传输数据,NioEndpoint继承AbstractEndpoint,在NioEndpoint中新增了Poller和SocketProcessor内部类,处理流程如下:
3.1.2 Processor
它有两个AbstractProtocol抽象继承类,分别在org.apache.coyote.http11.upgrade和org.apache.coyote包中,正常处理协议一般使用后者以及实现类,前者是在Servelt3.1之后新增加的。用于处理HTTP升级协议(WebSocket),如果socket的状态是UPGRADING就会调用前者包中的Processor进行处理。
3.1.3 Adapter
它只有一个实现列org.apache.catalina.connector包下的CoyoteAdapter,Processor在其process方法中会调用Adapter的service方法,Adapter的service方法主要是调用Container管道中的invoke方法来处理请求,在处理之前对Request和Response做了处理,将原来的Request和Response封装成了org.apache.catalina.connector的Request和Response,并在完成处理后,判断是否启用了Comet(长连接推模式)和是否启动了异步请求。