zoukankan      html  css  js  c++  java
  • 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,如下:

      

      

  • 相关阅读:
    jsp中上传图片(使用ajaxfileupload)
    快慢的悖论
    为什么所有的架构都是糟糕的
    软件项目是这样失败的。
    初识微信小程序
    Hibernate hql getHibernateTemplate()常用方法汇总
    JAVA中关于set()和get()方法的理解及使用
    java性能调优实战
    PLSQL显示乱码-无法进行中文条件查询解决
    Oracle 10g bigfile表空间简介
  • 原文地址:https://www.cnblogs.com/alimayun/p/10633872.html
Copyright © 2011-2022 走看看