ホームページ > Java > &#&チュートリアル > Java 9 の HTTP2 プロトコルのサポートとノンブロッキング HTTP API 分析

Java 9 の HTTP2 プロトコルのサポートとノンブロッキング HTTP API 分析

王林
リリース: 2023-04-22 21:52:06
転載
1079 人が閲覧しました

1. HTTP/2 の概要

HTTP/2 は、HTTP/1.1 の複雑なインフラストラクチャの維持によって生じる苦痛を軽減することを目的としており、優れたパフォーマンスを備えています。 HTTP/2 は依然として HTTP/1.1 との下位互換性がありますが、テキストベースのプロトコルではなくなりました。

HTTP/2 多重化により、単一の接続で複数の双方向ストリームを処理できるようになり、クライアントは単一の接続で複数のリソースを同時にダウンロードできるようになります。

HTTP 1.x プロトコルはテキストベースであるため、メッセージは非常に長くなります。場合によっては、同じ HTTP ヘッダーのセットが何度も交換されることがあります。 HTTP/2 はリクエスト全体で HTTP ヘッダーを維持するため、データの繰り返し交換が不要になり、データのやり取りに必要な帯域幅が大幅に削減されます。

HTTP/2 データ プッシュ

HTTP/2 のサーバー側データ プッシュは、WebSocket への継続またはアップグレードであると思われるかもしれませんが、そうではありません。 WebSocket は、TCP 接続が確立された後にサーバーがクライアントにデータを送信する、クライアントとサーバー間の全二重通信の方法ですが、HTTP/2 は異なるソリューションを提供します。

HTTP/2 プッシュは、クライアントの観点からリソース要求を開始せずに、リソースをクライアントにアクティブに送信することです。これは、サーバーが、Web サイトがさらに必要とする他のリソースをリクエストから認識し、クライアントが再度リクエストするずっと前に、それらをすべてまとめて (事前に) 送信できることを意味します。

#現在 HTTP/2 をサポートしている Java HTTP クライアント

    ##Jetty
  • #Netty
  • OkHttp
  • ##Vert.xx

  • Firefly

  • ただし、この記事では、これらの Java クライアント ソフトウェアを導入しますが、Java9 によって提供される HTTP/2 サポートも導入します。

  • 2. Java 9 HTTP/2 クライアント

最初に Java 9 構文を使用してモジュールをインポートします。

jdk.incubator.httpclient

module com.springui.echo.client {
    requires jdk.incubator.httpclient;
}
ログイン後にコピー

Java 9 の新しい HTTP Cient API はビルダー パターンに従います。 HttpClient は、HTTP リクエストを操作するために使用されるエントリ ポイントであり、最初に構築されてから使用されます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">HttpClient client = HttpClient .newBuilder() .version(Version.HTTP_2) //支持HTTP2 .build();</pre><div class="contentsignin">ログイン後にコピー</div></div>ブロッキング モードでのリクエストの送信

HttpClient インスタンスを取得したら、それを使用して HttpRequest を送信できます。HttpRequest インスタンスは、コンストラクターを使用して作成することもできます。

HttpResponse<String> response = client.send(
    HttpRequest
        .newBuilder(TEST_URI)  //请求地址
        .POST(BodyProcessor.fromString("Hello world")) //POST报文数据
        .build(),
    BodyHandler.asString()  //请求响应数据处理,接收字符串
);
ログイン後にコピー

リクエスト送信後、レスポンスデータを取得するまでスレッドがブロックされるのはJAVA 8以前のHTTP APIと同様です。ただし、Java 9 は、非同期で非ブロッキングなリクエストの送信および処理のメソッドを提供します。これは、高度に同時実行される HTTP リクエストおよび処理により適しています。

ノンブロッキング モードでのリクエストの送信 (Java 9)

次の例では、10 個のランダムな整数が非同期に送信されます。

List<CompletableFuture<String>> responseFutures = 
        IntStream.of(1,2,3,4,5,6,7,8,9,10)  //10个整数形成IntStream,Java 8的语法
        .mapToObj(String::valueOf) //10个整数转换成字符串,Java 8的语法
        .map(message -> client.sendAsync( //将10个整数字符串作为内容,发送10个异步请求
                HttpRequest.newBuilder(TEST_URI)
                        .POST(HttpRequest.BodyProcessor.fromString(message))
                        .build(),
                HttpResponse.BodyHandler.asString()
             ).thenApply(HttpResponse::body)  //以CompletableFuture<HttpResponse.body()>作为流处理的返回值
        )
        .collect(Collectors.toList());  //将Stream转成List
ログイン後にコピー

上の例では、Java 8 の Stream ストリーミング API を広範囲に利用しています。詳しくない場合は、私が以前に書いた記事をいくつか読んでください。

sendAsync メソッドの戻り値 CompletableFuture> は、thenApply(HttpResponse::body) を使用してさらに処理され、最終的な戻り値は CompletableFuture になります。

CompletableFuture は、同時非同期処理の結果を出力する Java 非同期プログラミングの知識です。

responseFutures.stream().forEach(future -> {
    LOGGER.info("Async response: " + future.getNow(null));
});
ログイン後にコピー

すべてのリクエストが非同期で送信されるため、最終的な印刷ログは 1、2、3、4、5、6、7、8、9、10 の順序で処理されない可能性があることがわかります。返される結果は、非同期処理に使用される CompletableFuture の結果です。

3. HTTP2 をサポートする Push-Promise フレーム

上記の例はすべて HTTP/1.1 プロトコルで完了できますが、新しいノンブロッキング非同期 API が追加され、HTTP/2特徴。心配しないでください。Java 9 クライアント API は HTTP/2 と最も緊密に統合されています。HTTP2 を使用してリクエストを送信し、複数の非同期データ結果を取得できます。 (一部のデータは事前​​にプッシュされます。もちろん、これにはサーバーが連携のために HTTP/2 もサポートしている必要があります)

Map<HttpRequest,CompletableFuture<HttpResponse<String>>> responses =
        client.sendAsync(    //注意这里只发送一次请求
          HttpRequest.newBuilder(TEST_URI)
                  .POST(HttpRequest.BodyProcessor.fromString(TEST_MESSAGE))
                  .build(),
          HttpResponse.MultiProcessor.asMap(    //多个资源的响应结果
                  request -> Optional.of(HttpResponse.BodyHandler.asString())
          )
).join();
responses.forEach((request, responseFuture) -> {
  LOGGER.info("Async response: " + responseFuture.getNow(null));
});
ログイン後にコピー

Java 9 の観点から見ると、新しい HTTP/2 クライアント API は優れているように見えます。ただし、現状では関連技術の活用がまだ成熟していないように筆者は感じているので、とりあえずは皆さんも試してみてはいかがでしょうか。

以上がJava 9 の HTTP2 プロトコルのサポートとノンブロッキング HTTP API 分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート