Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议
Connector是Tomcat中非常重要的一个组成部分,说白了,就是如何从客户端获取到相应的请求信息。这部分主要包括的难点有这样几个部分:
1、客户端与服务端的协议
客户端与服务端的协议是多种多样的,Tomcat肯定不能仅仅支持HTTP协议
2、数据I/O方式
I/O通常有NIO、BIO等多种方式,如何提高数据传输的效率?
一、Coyote
1、Coyote简介
Tomcat中的Connector就是Coyote,功能主要是封装了底层的网络通信。为Catalina容器提供了统一的接口,使容器与具体的协议以及I/O解耦。如图:

注:Catalina就是Tomcat中servlet容器实现。
2、Tomcat支持的协议与I/O方式
HTTP/1.1、AJP协议(用于和一些web服务器集成,如nginx等等)、HTTP/2.0
BIO(8.0版本后就不用了,毕竟慢)、NIO、NIO2、APR
协议和I/O方式分别是用于应用层以及传输层,如下图所示:

二、web请求处理
以下动图为tomcat处理请求的过程:

1、Connector设计

endpoint:Tomcat中提供了AbstractEndpoint抽象类,用于监听客户端的请求,收取客户端的socket,并且根据不同的I/O方式提供了NioEndpoint、AprEndpoint、Nio2Endpoint。
processor:Coyete协议处理接口,负责构造request以及response对象,并通过adapter提交到catalina容器。主要包括HTTP11Processor、AjpProcessor、StreamProcessor(HTTP/2.0)
protocolHandler:封装了endpoint以及processor
upgradeProtocol:表示HTTP升级协议,根据请求创建一个用于升级处理的令牌upgradeToken
2、请求处理过程

上图是Tomcat8.5版本前的处理过程,在8.5之后,由于增加了upgradeProtocol支持HTTP升级协议处理,过程变成下图:

过程解释:



三、Tomcat支持的相关协议
1、HTTP

a、请求信息示例:



b、响应信息示例:


在Tomcat中,相关配置可以在server.xml中查看,例如:

2、AJP
一般在应用服务器(Tomcat、JBoss等等)的前端布置web服务器(apache server、nginx等等)。目的有如下:
a、可以做负载均衡,将请求合理的分配到应用服务器上;
b、静态资源优化,web服务器在静态资源处理上有性能优势。
那这样布置的话也会产生问题,web服务器与应用服务器之间需要通过TCP建立连接,那这样的话就需要建立很多的socket连接,并且连接也是无状态,都是短连接,效率非常低。所以需要减少socket的创建,并且尽量保证持久的TCP连接。
AJP协议就是为了解决这两个问题产生的,基于二进制传输,并且目前主流的web服务器都支持AJP协议。

请求消息格式与响应消息格式:



3、HTTP/2.0



由于协议这块对应的内容非常之多,所以通过以下两个图简单对比下HTTP/1.1与HTTP/2.0,如下:


Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议的更多相关文章
- Tomcat架构解析(一)-----Tomcat总体架构
Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server 1.最简单的服务器结构 最简单的服务器结构如图所示: ...
- Tomcat架构(四)
8标准覆盖机制J2SE 1.4 and 1.5 都包含了一个XML处理解析器的Java API .Bootstrap 类加载器加载这个解析器的类文件,所以这个解析器会优先于任何一个安装在CLASSPA ...
- Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程
Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理.需要解决的问题有监听.协议以及处理器映射等等. 一.Connector设计 Connector要实现的 ...
- Tomcat架构解析(三)-----Engine、host、context解析以及web应用加载
上一篇博文介绍了Server的创建,在Server创建完之后,就进入到Engine的创建过程,如下: 一.Engine的创建 1.创建Engine实例 当前次栈顶元素为Service对象,通过Se ...
- Tomcat架构解析(五)-----Tomcat的类加载机制
类加载器就是根据类的全限定名(例如com.ty.xxx.xxx)来获取此类的二进制字节流的代码模块,从而程序可以自己去获取到相关的类. 一.java中的类加载器 1.类加载器类别 java中的类加 ...
- Tomcat架构解析(六)-----BIO、NIO、NIO2、APR
对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求 ...
- Tomcat源代码解析系列
学web也有一段时间了.为了从底层了解web应用在Tomcat中的执行,决定看一下Tomcat的源代码參见<How Tomcat works> 和大牛博客.对大体架构有了一定的了解, ...
- Tomcat 架构原理解析到架构设计借鉴
Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...
- tomcat架构
很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动.这样,这些应用服务器的性能基本上就取决于Tomcat ...
随机推荐
- ES3之closure ( 闭包 )
词法作用域中使用的域,是变量在代码中声明的位置所决定的.嵌套的函数可以访问在其外部声明的变量. 闭包是函数和声明该函数的词法环境的组合. 1 创建单个闭包 JavaScript中的函数会形成闭包. 闭 ...
- 微信小程序开发——使用回调函数出现异常:TypeError: Cannot read property 'setData' of undefined
关键技术点: 作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把this赋给一个新的变量才可以了. 业务需求: 微信小程序开发,业务逻辑需要,需要把获取手机号码的业务逻辑作 ...
- 【centos】centos安装配置samba
因为我的centos为一台阿里云服务器,想和我本机(mac)进行文件共享.所以在我的阿里云上安装配置samba. 服务器环境:centos 7.3 本地环境:mac 第1步:首先查看是否已经安装过了s ...
- 《基于Nginx的中间件架构》学习笔记---2.nginx的优点以及nginx的安装
[优势] 优势1:IO多路复用和epoll模型(详见总结知识) 优势2:轻量级(1.功能模块少:只保留了一些核心代码 2.代码模块化) 优势3:CPU亲和 这里的CPU亲和指的是:是一种把cp ...
- iOS工程中创建pch文件
1.新建pch类文件 2.在工程配置中,Build Setting 下搜索"pre"寻找Apple LLVM6.1 - Language下的 Preflx Header 3.点开P ...
- error:cv_bridge---opencv和ros连接起来的桥
有多个warning出现...版本冲突 解决办法: cv_bridge[opencv和ros连接起来的桥],默认依赖的opencv版本是2.4.8,如果安装了新的opencv版本,比如3.1.0,那么 ...
- stark组件开发之提取公共视图函数
路由问题, 已经解决! 然后就是视图函数的问题了: 不想重复写的解决途径就是, python 类的继承了! 写一个基类, 基类定义 增删改查. 然后其他的,全部去继承他! from django. ...
- Split Array into Consecutive Subsequences
659. Split Array into Consecutive Subsequences You are given an integer array sorted in ascending or ...
- [z]表空间对应文件的AUTOEXTEND ON NEXT指定的值对性能的影响
创建表空间的时候指定的数据文件可以设为自动扩展,以及每次扩展多少容量,如果发现在大数据量插入的时候非常慢,可能的原因是NEXT指定的值太小.下面来模拟一下这个过程:1,创建一个表空间:CREATE T ...
- background 和渐变 总结
一,background-position:(图片定位) 三种写法: 1):按%比,左上角最小(0%,0%),右下角最大(100%,%100): 2):(x,y)左上角最小(0,0),右下角最大(ma ...