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等协议的更多相关文章

  1. Tomcat架构解析(一)-----Tomcat总体架构

    Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server   1.最简单的服务器结构 最简单的服务器结构如图所示: ...

  2. Tomcat架构(四)

    8标准覆盖机制J2SE 1.4 and 1.5 都包含了一个XML处理解析器的Java API .Bootstrap 类加载器加载这个解析器的类文件,所以这个解析器会优先于任何一个安装在CLASSPA ...

  3. Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程

    Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理.需要解决的问题有监听.协议以及处理器映射等等. 一.Connector设计   Connector要实现的 ...

  4. Tomcat架构解析(三)-----Engine、host、context解析以及web应用加载

    上一篇博文介绍了Server的创建,在Server创建完之后,就进入到Engine的创建过程,如下: 一.Engine的创建   1.创建Engine实例 当前次栈顶元素为Service对象,通过Se ...

  5. Tomcat架构解析(五)-----Tomcat的类加载机制

    类加载器就是根据类的全限定名(例如com.ty.xxx.xxx)来获取此类的二进制字节流的代码模块,从而程序可以自己去获取到相关的类. 一.java中的类加载器   1.类加载器类别 java中的类加 ...

  6. Tomcat架构解析(六)-----BIO、NIO、NIO2、APR

    对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求 ...

  7. Tomcat源代码解析系列

    学web也有一段时间了.为了从底层了解web应用在Tomcat中的执行,决定看一下Tomcat的源代码參见<How Tomcat works>    和大牛博客.对大体架构有了一定的了解, ...

  8. Tomcat 架构原理解析到架构设计借鉴

    Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...

  9. tomcat架构

    很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动.这样,这些应用服务器的性能基本上就取决于Tomcat ...

随机推荐

  1. Google、微软软件测试之道

    扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  2. (转)css选择器及其优先级

    文章主要介绍什么是CSS选择器,CSS选择器的分类以及CSS选择器的优先级三部分内容,希望能够帮助到正在学习CSS的童鞋,有什么不足的地方欢迎大家批评指正. 一.什么是CSS选择器? CSS选择器又被 ...

  3. day 31 表单标签,CSS

    一. HTML表单标签 HTML表单用于搜集不同类型的用户输入,然后把数据提交给服务器处理. 常用的表单标签: 标签 作用 form 所有表单标签的根标签 input 输入标签,包括单行输入框.密码框 ...

  4. IntelliJ+Maven+Spring+Tomcat项目搭建(MAC)

    1.新建项目 打开idea,通过File->new->project,会弹出如下的信息: 接下来点击下一步,创建项目,点击“下一步”: 选择默认的Maven以及setting文件,点击“下 ...

  5. Debug和汇编编译器masm对指令的不同处理

    我们在Debug和源程序中写入同样形式的指令 : "mov al,[0]","mov bl,[1]","mov cl,[2]"," ...

  6. PHP系统编程--PHP进程信号处理(转)

    原地址:https://www.cnblogs.com/linzhenjie/p/5485436.html PHP的pcntl扩展提供了信号处理的功能,利用它可以让PHP来接管信号的处理,在开发服务器 ...

  7. Python中list,tuple,dict,set的区别和用法(转)

    原文地址:http://www.cnblogs.com/soaringEveryday/p/5044007.html Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个 ...

  8. mysql8 公用表表达式CTE的使用

    公用表表达式CTE就是命名的临时结果集,作用范围是当前语句. 说白点你可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询. 一.cte的语 ...

  9. 左侧菜单栏,有对个li对应一个content

    html部分截图 不多说直接上js /*左侧导航栏*/var sect=$(".sect"); $(".nav-list .nav-a").each(funct ...

  10. 关于opencv中的颜色模型转换之CV_BGR2HSV

    1.opencv函数cvCvtColor(rgb_im,hsv_im,CV_BGR2HSV)中使用的RGB颜色空间转到HSV算法: max=max(R,G,B) min=min(R,G,B) if R ...