HTTP/3 には、ヘッドオブラインブロッキング、コネクションマイグレーション、ゼロラウンドトリップタイム (0-RTT) という 3 つの主な機能があります。HTTP/3 は、複数のデバイスでネットワークを切り替えるシナリオや、ネットワーク接続が弱いシナリオに特に適しています。本トピックでは、クラウドネイティブゲートウェイで HTTP/3 を有効にして使用する方法について説明します。
前提条件
バージョン V1.2.15 以降の Microservices Engine (MSE) クラウドネイティブゲートウェイが作成されていること。詳細については、「MSE クラウドネイティブゲートウェイの作成」をご参照ください。
背景情報
HTTP/3 を使用するには、サービスが HTTP/3 をサポートし、リクエストされたトラフィックが 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 は、バイナリフレーミングと多重化レイヤーを導入し、トランスポート層を変更することなくレイテンシーを削減します。しかし、TCP パケットの損失を回復する必要があるシナリオでは、HTTP/2 の多重化による同時実行機能は効果を発揮しません。パケットが失われたり、順序が入れ替わったりすると、パケット損失の影響を受けるかどうかに関わらず、すべてのアクティビティリクエストが一定期間中断されます。詳細については、「HTTP/2」をご参照ください。
HTTP/3
2022 年 6 月 6 日、IETF QUIC ワーキンググループおよび HTTP ワーキンググループのメンバーである Robin Marx 氏は、5 年間の努力の末、HTTP/3 が RFC 9114 で提案標準として公開されたと発表しました。詳細については、「HTTP/3 From A To Z: Core Concepts」および「RFC 9114」をご参照ください。
HTTP/3 は、以前は HTTP-over-QUIC と呼ばれていましたが、Google が長年の経験に基づいて開発した UDP ベースの QUIC プロトコルです。IETF は 2018 年に HTTP-over-QUIC を HTTP/3 に改名しました。Cloudflare、Google Chrome、Firefox Nightly が HTTP/3 をサポートしています。
HTTP/2 に存在するヘッドオブラインブロッキングの問題を修正するため、HTTP/3 はもはや TCP ベースではなく、UDP 上に構築されています。HTTP/3 では、ストリームを使用して HTTP/2 が提供する多重化機能をさらに拡張し、輻輳制御とヘッダー圧縮のパフォーマンスが向上しています。ヘッドオブラインブロッキングの詳細については、「ヘッドオブラインブロッキング」をご参照ください。
フローチャート
操作手順
MSE コンソールでの HTTP/3 の有効化
-
クラウドネイティブゲートウェイで HTTP/3 を有効にします。
MSE コンソール にログインします。上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーション ウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、[パラメーターの設定] をクリックします。
-
[Gateway Engine Parameters] セクションで、EnableHttp3 パラメーターを見つけ、[Actions] 列の [Edit] をクリックします。
[Modify Parameters] ダイアログボックスで、[Value] スイッチをオンにし、[OK] をクリックします。
-
ゲートウェイのドメイン名にプロトコルとして HTTPS が設定されているかどうかを確認します。
HTTP/3 はセキュリティのために HTTPS を必要とします。ゲートウェイ上のテストドメインで HTTPS を有効にする必要があります。詳細については、「ドメイン名の作成」をご参照ください。左側のナビゲーションペインで、Domain Name Management をクリックします。ドメインリストで、対象ドメインの Protocol 列に HTTPS と関連付けられた証明書 (例:
8880972-cn-hangzhou) が表示されていることを確認します。説明ゲートウェイに HTTPS ドメイン名が設定されている場合、[Overview] ページでゲートウェイに関連付けられている Classic Load Balancer (CLB) インスタンスの名前をクリックできます。CLB コンソールに移動し、CLB インスタンスのリスナーポート 443 の [ヘルスチェックのステータス]が正常であることを確認します。
-
ゲートウェイに HTTP サービスを追加し、ルーティングルールを追加します。
HTTP/1.1 をサポートするバックエンドテストサービスを追加します。詳細については、「サービスの追加」および「サービスソースの追加」をご参照ください。
-
テストサービス用のルーティングルールを追加します。詳細については、「ルーティングルールの作成」をご参照ください。
たとえば、quic という名前のルーティングルールを追加します。
このルールは公開され、
/quicの完全パス一致を使用し、ドメインapi.alibaba-inc.comに関連付けられ、single service をターゲットとします。 次の cURL コマンドを実行して、HTTP/3 リクエストテストを開始します:
curl --http3 https://api.alibaba-inc.com/quic --resolve api.alibaba-inc.com:443:<CLB インスタンスの IP アドレス> -k説明HTTP/3 テストを実行するには、ソースコードをコンパイルする必要があります。既存の cURL HTTP/3 イメージをテストに使用する場合、ソースコードをコンパイルする必要はありません。ビジネス要件に基づいてテスト方法を選択できます。詳細については、「curl-http3」をご参照ください。
Ingress を使用した HTTP/3 の有効化
-
クラウドネイティブゲートウェイで HTTP/3 を有効にします。
MSE コンソール にログインします。上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーション ウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、[パラメーターの設定] をクリックします。
-
[Gateway Engine Parameters] セクションで、EnableHttp3 パラメーターを見つけ、[Actions] 列の [Edit] をクリックします。
[Modify Parameters] ダイアログボックスで、[Value] スイッチをオンにし、[OK] をクリックします。
Container Service for Kubernetes (ACK) クラスターに MSE Ingress Controller をインストールし、ゲートウェイを MSE Ingress Controller に関連付けます。
MSE Ingress Controller のインストール方法の詳細については、「MSE Ingress Controller アドオンの管理」をご参照ください。
MSE クラウドネイティブゲートウェイを MSE Ingress Controller に関連付ける方法の詳細については、「MseIngressConfig の設定」をご参照ください。
ACK クラスターで Ingress を設定します。
ACK クラスターで HTTPS ドメイン名用の HTTPS Secret とルーティングルールを作成します。サンプルコード:
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 # バックエンドサービスが HTTP/2 を使用している場合は、このパラメーターを 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次の cURL コマンドを実行して、HTTP/3 リクエストテストを開始します:
curl --http3 https://https-example.foo.com/quic --resolve https-example.foo.com:443:<CLB インスタンスの IP アドレス> -k