TOMCAT简单整理(二)

 

连接器:Coyote  

Coyote是Tomcat连接器框架的名称,是Tomcat服务器提供的客户端访问的外部接口,客户端通过Coyote与服务器建立连接,发送请求并接受响应。

Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了统一的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。Coyote将Socket输入转换封装为Request对象,交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Response对象将结果写入输入流。 

Coyote作为独立的模块,只负责具体协议和IO相关操作,和Servlet没有直接关系,即便是Request和Response对象也没有实现Servlet规范对应的接口,而是在Catalina中将它们进一步封装为ServletRequest和ServletResponse。

 在8.0之前,Tomcat 默认采用的I/0方式为BIO,之后改为NIO。 无论NIO、 NIO2 还是APR, 在性能方面均优于以往的BIO。如果采用APR, 甚至可以达到Apache HTTP Server的影响性能。


Tomcat为了实现支持多种I/0模型和应用层协议,一个容器可能对接多个连接器,就好比一-个房间有多个门。但是单独的连接器或者容器都不能对外提供服务,需要把它们组装起来才能工作,组装后这个整体叫作Service组件。这里请你注意, service本身没有做什么重要的事情,只是在连接器和容器外面多包了一-层,把它们组装在一-起。 Tomcat内可能有多个Service ,这样的设计也是出于灵活性的考虑。通过在Tomcat中配置多个Service ,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。

 

EndPoint:Coyote通信端点(通信监听的接口),是具体的Socket接受和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议。然后在Tomcat中,并没有EndPoint接口,而是提供了一个叫做AbstractEndPoint抽象类,里面定义了两个内部类:Acceptor和SocketProcessor。Acceptor用于监听Socket请求,SocketProcessor用于处理接受到的Socket请求,它实现了Runnable接口,在run方法内调用协议处理器组件Processor进行处理。为了提高处理能力,SocketProcessor被提交到线程池来执行。

Processor:Coyote协议处理接口,如果说EndPoint是用来实现TCP/IP协议的,那么Processor就是用来实现HTTP协议的,Processor处理来自EndPoint的Socket,读取字节流解析成Tomcat Request、Response对象,并通过Adapter将其提交到容器处理,Processor是对应用层协议的抽象。

ProcessorHandler: Coyote协议接口,通过EndPoint和Processor,实现对具体协议的处理能力。

 

Adapter:由于协议不同,客户端发过来的请求信息也不尽相同, Tomcat定义了自己的Request类来“存放”这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类. 但是这个Request对象不是标准的ServletRequest ,也就意味着,不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter ,这是适配器模式的经典运用,连接器调用coyoteAdapter的Sevice方法,传入的是Tomcat Request对象, CoyoteAdapter负责将Tomcat Request转成ServletRequest ,再调用容器的Service方法。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章