Tomcat简单分析-Connector

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(长连接推模式)和是否启动了异步请求。

猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/80948792