Connector和Container的微妙关系

80 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

Connector和Container的微妙关系

由上述内容我们大致可以知道一个请求发送到Tomcat之后,首先经过Service然 后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为 Request和Response来具体处理,Request和Response封装完之后再交由 Container进行处理,Container处理完请求之后再返回给Connector,最后在 由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理 完了!

Connector最底层使用的是Socket来进行连接的,Request和Response是按照 HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

Tomcat既然需要处理请求,那么肯定需要先接收到这个请求,接收请求这个东 西我们首先就需要看一下Connector!

Connector架构分析

Connector用于接受请求并将请求封装成Request和Response,然后交给 Container进行处理,Container处理完之后在交给Connector返回给客户端。 因此,我们可以把Connector分为四个方面进行理解:

  1. Connector如何接受请求的?
  2. 如何将请求封装成Request和Response的?
  3. 封装完之后的Request和Response如何交给Container进行处理的?
  4. Container处理完之后如何交给Connector并返回给客户端的?
  5. Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler 代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的, Http11NioProtocol使用的是NioSocket来连接的。

其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。

  1. Endpoint用来处理底层Socket的网络连接,Processor用于将 Endpoint接收到的Socket封装成Request,Adapter用于将Request交给 Container进行具体的处理。
  2. Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实 现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适 配到Servlet容器进行具体的处理。
  3. Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和 AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请 求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收 到的Socket,在内部调用Processor进行处理。

至此,我们应该很轻松的回答1,2,3的问题了,但是4还是不知道,那么我们 就来看一下Container是如何进行处理的以及处理完之后是如何将处理完的结果 返回给Connector的?