全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用HTTP/3協議訪問ASM入口網關

更新時間:Aug 23, 2024

HTTP/3是HTTP協議的第三個主要版本,與HTTP/1.1和HTTP/2不同,HTTP/3協議不再使用傳統的基於TCP的傳輸層協議,改為採用基於UDP協議的QUIC(Quick UDP Internet Connection)協議,這一變化使HTTP/3具備了更低的延遲、更加健壯的錯誤恢複以及更加高效的串連複用等特點。本文介紹如何在ASM網關上配置基於HTTP/3協議的服務。

背景資訊

HTTP/3基於QUIC協議,由於其底層基於UDP協議,相比於HTTP/2有以下優點:

  • 減少握手延遲:HTTP/3通過QUIC協議的0-RTT特性完成串連建立,同時將TLS整合到協議中,支援了加密和握手同時進行,大幅減少了串連建立時的延遲。

  • 新的多工機制:HTTP/2存在TCP串連層級的隊頭阻塞(Head-of-Line Blocking),HTTP/3使用QUIC協議在同一個串連上多工多個獨立的流,每個資料流是獨立的,即使一個資料流中的某個包丟失,其他資料流的傳輸不會被阻塞。這樣,單一資料流的阻塞不再會影響整個串連的傳輸效能。

  • 串連遷移:HTTP/3支援串連在不同 IP 位址之間遷移,即使使用者網路環境發生變化(比如從Wi-Fi網路切換至移動網路),確保了串連的持久性和穩定性。

  • 安全:HTTP/3強制要求使用TLS1.3進行加密傳輸,確保了更高的安全性和隱私保護。

ASM網關已經支援了HTTP/3協議,使用者可以直接通過HTTP/3協議訪問ASM網關上暴露的服務,進一步提升業務的效能和穩定性。

前提條件

步驟一:啟用HTTP3協議支援

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格執行個體 > 基本資料

  3. 基本資料頁面右上方單擊功能設定,在展開的功能設定更新側邊欄中勾選是否啟用HTTP/3支援

步驟二:在ASM網關上啟用UDP監聽

QUIC協議基於UDP協議,因此需要在ASM網關上開啟UDP監聽。

這裡直接修改ASM網關的YAML配置,在網關的444連接埠開啟UDP監聽。

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  labels:
    asm-gateway-type: ingress
  name: ingressgateway
  namespace: istio-system
spec:
  ......
  ports:
    - name: http-0
      port: 80
      protocol: HTTP
      targetPort: 80
    - name: udp    # 新增444連接埠的UDP監聽
      port: 444
      protocol: UDP
      targetPort: 444
  ......
說明

ASM網關支援在同一個連接埠上同時開啟TCP監聽和UDP監聽,例如:您可以在已經暴露了HTTPS服務的443連接埠上再開啟UDP監聽,兩者並不衝突。

步驟三:配置網關規則

QUIC強制要求使用TLS通訊,因此必須為網關規則配置認證。使用以下YAML內容,更新網關規則。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: httpbin
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - '*'
      port:
        name: test
        number: 80
        protocol: HTTP
    - hosts:
      - '*'
      port:
        name: quic
        number: 444
        protocol: HTTPS
      tls:
        credentialName: aliyun.com.cert
        mode: SIMPLE

步驟四:測試

curl是一個常見的HTTP協議測試載入器,但是curl命令預設不支援HTTP/3協議,您可以通過以下方式查看是否支援。

curl --version | grep http3

如果看到類似下面的輸出,則表示當前環境的curl命令支援HTTP/3。

curl 8.9.0-DEV (aarch64-apple-darwin23.5.0) libcurl/8.9.0-DEV quictls/3.1.4 zlib/1.2.12 libidn2/2.3.7 nghttp2/1.59.0 ngtcp2/1.2.0 nghttp3/1.1.0

如果沒有輸出,表示當前環境的curl命令不支援HTTP/3。您可以重新構建一個支援HTTP/3的版本。具體操作,請參見Build curl with quictls

構建完成之後,您可以使用如下命令進行測試。

curl -k --http3-only -H Host:aliyun.com --resolve aliyun.com:444:${ASM網關IP}  https://aliyun.com:444/headers -v

預期輸出:

......
* Connected to aliyun.com (xxx.xx.xx.x) port 444
* using HTTP/3
* [HTTP/3] [0] OPENED stream for https://aliyun.com:444/headers
* [HTTP/3] [0] [:method: GET]
* [HTTP/3] [0] [:scheme: https]
* [HTTP/3] [0] [:authority: aliyun.com]
* [HTTP/3] [0] [:path: /headers]
* [HTTP/3] [0] [user-agent: curl/8.9.0-DEV]
* [HTTP/3] [0] [accept: */*]
> GET /headers HTTP/3
> Host:aliyun.com
> User-Agent: curl/8.9.0-DEV
> Accept: */*
>
* Request completely sent off
* old SSL session ID is stale, removing
< HTTP/3 200
< server: istio-envoy
< date: Wed, 26 Jun 2024 07:40:07 GMT
< content-type: application/json
< content-length: 460
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 1
< alt-svc: h3=":444"; ma=86400
<
{
  "headers": {
    "Accept": "*/*",
    "Host": "aliyun.com",
    "Transfer-Encoding": "chunked",
    "User-Agent": "curl/8.9.0-DEV",
    "X-Envoy-Attempt-Count": "1",
    "X-Envoy-External-Address": "xx.xx.xx.xx",
    "X-Forwarded-Client-Cert": "xxxxxxx"
  }
}
* Connection #0 to host aliyun.com left intact

相關文檔