博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat--Coyote连接器
阅读量:2443 次
发布时间:2019-05-10

本文共 2048 字,大约阅读时间需要 6 分钟。

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。

在这里插入图片描述

IO模型与协议

在Coyote中,Tomcat支持的多种I/O模型和应用层协议,具体如下:(Tomcat支持的IO模型自8.5版本起,移出了对BIO的支持)

I/O模型 描述
NIO 非阻塞I/O,采用Java NIO类库实现
NIO2 异步I/O,采用JDK7最新的NIO2类库实现
APR 采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库
应用层协议 描述
HTTP/1.1 这是大部分应用采用的访问协议
AJP 用于和Web服务器集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3
HTTP/2 HTTP2.0大幅度提升了Web性能。下一代HTTP协议,自8.5以及9.0后支持

协议分层:

在这里插入图片描述

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

连接器组件

在这里插入图片描述

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

EndPoint

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

Processor:

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

ProtocolHandler:

  • ProtocolHandler:Coyote协议接口,通过Endpoint和Processor,实现针对具体协议的处理能力。Tomcat按照协议和IO提供了6个实现类:
    • AjpNioProtocal
    • AjpAprProtocol
    • AjpNio2Protocol
    • Http11NioProtocol
    • Http11Nio2Protocol
    • Http11AprProtocol
  • 我们在配置tomcat/confserver.xml时,至少要指定具体的ProtocolHandler,当然也可以是协议名称,如:HTTP/1.1,如果安装了APR,那么将使用Http11AprProtocol,否则使用Http1NioProtocol;

Adapter:

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

转载地址:http://cvpqb.baihongyu.com/

你可能感兴趣的文章
javascript 闭包_了解JavaScript闭包:实用方法
查看>>
laravel集成谷歌验证_如何将Google的两因素身份验证添加到Laravel
查看>>
rails 创建_使用Rails和Icecast创建在线流媒体广播
查看>>
票务小程序源码_使用AdonisJs构建支持票务应用程序-第2部分
查看>>
使用Vue,ASP.NET Core和Okta构建安全的待办应用
查看>>
前端长列表渲染优化_用于前端开发的浏览器渲染优化
查看>>
使用Vue.js和Electron创建桌面测验应用程序
查看>>
js 数组从头添加到数组_编码练习:从头开始构建JavaScript数组方法
查看>>
react-hooks_使用React Hooks构建一个React To-Do应用(无类组件)
查看>>
chrome开发者工具_如何使用Chrome开发者工具查找性能瓶颈
查看>>
vue 使用人脸识别_使用Vue.js和Kairos构建简单的人脸识别应用
查看>>
vue 构建单页应用_如何使用Vue 2构建简单的单页应用程序(第1部分)
查看>>
使用Webtask.io构建无服务器MERN Story应用程序-部署零:1
查看>>
使用Webtask.io构建无服务器的MERN Story应用程序-部署零:2
查看>>
firebase vue_Firebase Cloud Firestore入门:构建Vue联系人应用
查看>>
node.js hapi_使用Hapi使用JavaScript异步构建安全的Node.js应用程序
查看>>
javascript入门_Netlify入门:部署JavaScript应用程序的最简单方法
查看>>
react hooks使用_使用React Hooks将React类组件转换为功能组件的5种方法
查看>>
使用Node.JS,React,Redux和Redux-saga Part3:身份验证构建Retrogames存档
查看>>
使用Node.JS,React,Redux和Redux-Saga Part2:Redux集成构建Retrogames存档。
查看>>