tomcat-连接器

架构介绍

  1. coyote是tomcat的连接器框架的名称,是tomcat服务器提供的客户端访问的外部接口。客户端通过coyote与服务器建立连接、发送请求并接受响应。
  2. coyote封装了底层的网络通信(socket请求以及响应处理),为Catalina容器提供统一的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。coyote将socket输入转换封装为request对象,交给Catalina容器进行处理,处理请求完成后,Catalina通过coyote提供的response对象将结果写入输出流。
  3. coyote做完独立的模块,只负责具体协议和IO的相关操作,与servlet规范实现没有直接关系,因此即便是request和response对象也并未实现servlet规范对象的接口,而是Catalina中将他们进一步封装为servletRequest和servletResponse。

IO模型与协议

在coyote中,tomcat支持的多种I/O模型和应用层协议,具体包含哪些IO 模型和应用层协议。

Tomcat支持的io模型(自8.5/9.0版本起,tomcat移除了对BIO的支持);

IO模型 描述
NIO 非阻塞I/O,采用JAVA NIO 类库实现
NIO2 异步I/O\,采用JDK 7最新的NIO 2类库实现。
APR

采用Apache 可移植运行库实现,是c/c++编写的本地库。如果选择该方案需要单独安装APR库。

Tomcat 支持的应用层协议:

应用层协议 描述
HTTP/1.1 这是大部分WEB应用采用的访问协议
AJP 用于和web服务器集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP1.3。
HTTP/2 HTTP 2.0大幅度的提升了web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。

协议分层:

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

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

连接器组件

连接器中的各个组件的作用如下:

EndPoint:

  1. EndPoint:coyote通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现Tcp/ip协议的。
  2. Tomcat并没有EndPoint接口,而是提供了一个抽象类AbstractEndpoint,里面定义了两个内部类:Acceptor和socketProcess。Acceptor用于监听Socket连接请求。ScoketProcessor用于处理接收到的socket请求,实现Runnable接口,在Run方法里调用协议处理组件Processor进行处理。为了提高处理能力,SocketProcessor被提交到线程池来执行。而这个线程 池叫做执行器(Executor)。

Processor:

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

ProtocolHandler:coyote协议接口,通过EndPoint和Processor,实现针对具体协议的处理能力。Tomcat按照协议和I/O提供了6个实现类:AjpNioProtocol、AjpAprProtocol、AjpNio2Protocol、Http11NioProtocol、Http11Nio2Protocol、Http11Aprprotocol。我们在配置tomcat/conf/server.xml时,至少要指定具体的ProtocolHandler,当然也可以指定协议名称,如:http/1.1,如果安装APR,那么将使用Http11AprProtocol,否则使用Http11NioProtocol。

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

发布了47 篇原创文章 · 获赞 24 · 访问量 2855

猜你喜欢

转载自blog.csdn.net/qq_40807366/article/details/105325192