在云原生网关中开启HTTP/3

HTTP/3具备三大特性:对头阻塞、连接迁移、O-RTT,尤其对于目前多设备网络切换、弱网连接具备很明显的优势。本文介绍如何在云原生网关中开启并使用HTTP/3。

前提条件

创建MSE云原生网关且网关版本为1.2.15及以上。

背景信息

HTTP/3的使用不仅需要业务服务自身支持HTTP/3,还需要外部请求的流量是HTTP/3。因为业务自身支持HTTP/3需要做一定的程序改造,所以大部分用户更倾向于保持自身业务不变,由接入网关完成协议转换。该方式虽然链路请求不如全程选择HTTP/3提升大,但也可以享受一部分HTTP/3的网络优势,因此本文以该链路为背景说明。

HTTP/1.1

HTTP/1.1使用空格分隔的文本字段来传递HTTP消息。虽然这些交换是可读的,但使用空格进行消息格式化会导致解析复杂和对变体行为的过度容忍。HTTP/1.1不包含多路复用层,因此经常使用多个TCP连接来并行处理请求。但是这样对拥塞控制和网络效率有负面影响。更多信息,请参见HTTP/1.1

HTTP/2

HTTP/2引入了二进制帧和多路复用层,在不修改传输层的情况下改善了延迟。但由于HTTP/2多路复用的并行特性对TCP的丢失恢复机制不可见,因此丢失或重新排序的数据包会导致所有活动请求都经历停顿,无论该请求是否直接受到丢失数据包的影响。更多信息,请参见HTTP/2

HTTP/3

2022年06月06日,IETF QUIC和HTTP工作组成员Robin Marx宣布,经过5年的努力,HTTP/3被标准化为RFC 9114。更多信息,请参见HTTP/3 From A To Z: Core ConceptsRFC 9114

HTTP/3采用了谷歌多年探索的基于UDP的QUIC协议,原名HTTP-over-QUIC,2018年被IETF批准更名为HTTP/3。目前,Cloudflare、Google Chrome、Firefox Nightly均表示支持HTTP/3。

为了解决HTTP/2中存在的队头阻塞问题,HTTP/3不再基于TCP建立,而是基于Google提出了基于UDP实现的开源协议QUIC,使用stream进一步扩展了HTTP/2的多路复用,并在阻塞控制、头部压缩等方面做了提升。更多信息,请参见队头阻塞

操作流程

image

操作步骤

通过MSE控制台配置

  1. 网关开启HTTP/3支持。

    1. 登录MSE网关管理控制台,并在顶部菜单栏选择地域。

    2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。

    3. 在左侧导航栏,单击参数配置

    4. 网关引擎参数区域,参数EnableHttp3操作列,单击编辑

      image

    5. 参数修改对话框,打开参数值开关并单击确定

  2. 检查网关配置的域名中是否开启HTTPS。

    HTTP/3要求使用HTTPS来保证链路安全性,因此需要在网关针对测试域名开启HTTPS。关于如何在网关中配置域名,请参见关联域名1677657587920-4b715a47-e640-49d3-a62b-19f11a1d2c34

    说明

    如果网关中配置了HTTPS域名,可以在网关基本概览页面,单击关联的CLB实例。跳转至CLB控制台查看CLB实例443监听端口的健康检查状态是否正常。

  3. 网关中添加HTTP服务并增加对应的路由配置。

    1. 添加HTTP/1.1的后端测试服务。具体操作,请参见添加服务新建服务来源

    2. 为测试服务添加路由。具体操作,请参见新建路由规则

      例如已经添加了一条名称为quic的路由规则。

      image

    3. 使用如下curl命令发起HTTP/3请求测试。

      curl --http3 https://api.alibaba-inc.com/quic --resolve api.alibaba-inc.com:443:<CLB IP地址> -k
      说明

      HTTP/3方式需编译源码,使用已有curl http3镜像测试无需编译,您可按需选择测试方式。更多信息,请参见curl-http3

通过Ingress配置

  1. 网关开启HTTP/3支持。

    1. 登录MSE网关管理控制台,并在顶部菜单栏选择地域。

    2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。

    3. 在左侧导航栏,单击参数配置

    4. 网关引擎参数区域,参数EnableHttp3操作列,单击编辑

      image

    5. 参数修改对话框,打开参数值开关并单击确定

  2. 在ACK集群安装MSE Ingress Controller并关联MSE云原生网关。

  3. 在ACK集群配置Ingress。

    在ACK集群中创建HTTPS使用的Secret以及HTTPS域名路由,如下所示:

    apiVersion: v1
    kind: Secret
    metadata:
      name: testsecret-tls
      namespace: default
    data:
      tls.crt: base64 # Base64编码的证书。
      tls.key: base64 # Base64编码的私钥。
    type: kubernetes.io/tls
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: tls-example-ingress
      annotations:
        nginx.ingress.kubernetes.io/backend-protocol: HTTP # 如果后端是H2配置:HTTP2。
    spec:
      tls:
      - hosts:
          - https-example.foo.com
        secretName: testsecret-tls
      rules:
      - host: https-example.foo.com
        http:
          paths:
          - path: /quic
            pathType: Prefix
            backend:
              service:
                name: service1  #后端服务
                port:
                  number: 80
  4. 使用如下curl命令发起HTTP/3请求测试。

    curl --http3 https://https-example.foo.com/quic --resolve https-example.foo.com:443:<CLB IP地址> -k