1. 序章

サーバープッシュテクノロジー(HTTP / 2( RFC 7540 )の一部)を使用すると、サーバー側からクライアントにリソースをプロアクティブに送信できます。 これは、HTTP/1.Xプルベースのアプローチからの大きな変更です。

Spring 5がもたらす新機能の1つは、Jakarta EE 8 Servlet4.0APIに付属するサーバープッシュサポートです。 この記事では、サーバープッシュを使用してSpringMVCコントローラーと統合する方法について説明します。

2. Mavenの依存関係

使用する依存関係を定義することから始めましょう。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

spring-mvcおよびservlet-apiの最新バージョンは、MavenCentralにあります。

3. HTTP/2の要件

サーバープッシュを使用するには、HTTP/2とサーブレット4.0APIをサポートするコンテナでアプリケーションを実行する必要があります。 さまざまなコンテナの構成要件は、 Springwikiにあります。

さらに、クライアント側でのHTTP/2サポートが必要です。 もちろん、ほとんどの現在のブラウザはこのサポートを持っています。

4. PushBuilderの機能

PushBuilder インターフェースは、サーバープッシュの実装を担当します。 Spring MVCでは、@RequestMappingで注釈が付けられたメソッドの引数としてPushBuilderを挿入できます。

この時点で、クライアントがHTTP / 2をサポートしていない場合、参照はnullとして送信されることを考慮することが重要です。

PushBuilderインターフェースによって提供されるコアAPIは次のとおりです。

  • path(文字列パス)– は、送信するリソースを示します
  • push()–はリソースをクライアントに送信します
  • addHeader(文字列名、文字列値)– は、プッシュされたリソースに使用するヘッダーを示します

5. 簡単な例

統合を示すために、demo.jspページを1つのリソース[logo.png]で作成します。

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PushBuilder demo</title>
</head>
<body>
    <span>PushBuilder demo</span>
    <br>
    <img src="<c:url value="/resources/logo.png"/>" alt="Logo" 
      height="126" width="411">
    <br>
    <!--Content-->
</body>
</html>

また、 PushController コントローラーを使用して2つのエンドポイントを公開します。1つはサーバープッシュを使用し、もう1つは使用しません。

@Controller
public class PushController {

    @GetMapping(path = "/demoWithPush")
    public String demoWithPush(PushBuilder pushBuilder) {
        if (null != pushBuilder) {
            pushBuilder.path("resources/logo.png").push();
        }
        return "demo";
    }

    @GetMapping(path = "/demoWithoutPush")
    public String demoWithoutPush() {
        return "demo";
    }
}

Chrome開発ツールを使用すると、両方のエンドポイントを呼び出すことで違いを確認できます。

demoWithoutPush メソッドを呼び出すと、ビューとリソースが公開され、プルテクノロジーを使用してクライアントによって消費されます。

demoWithPush メソッドを呼び出すと、プッシュサーバーの使用状況と、サーバーによってリソースが事前に配信される方法を確認できるため、読み込み時間が短縮されます。

サーバープッシュテクノロジーは、多くのシナリオでアプリケーションのページの読み込み時間を改善できます。 そうは言っても、レイテンシーは減少しますが、提供するリソースの数に応じて帯域幅を増やすことができることを考慮する必要があります。

このテクノロジーをCaching Resource Minification 、CDNなどの他の戦略と組み合わせ、アプリケーションでパフォーマンステストを実行して、サーバーを使用するための理想的なエンドポイントを決定することもお勧めします。押す。

6. 結論

このクイックチュートリアルでは、 PushBuilderインターフェイスを使用してSpringMVCでサーバープッシュテクノロジーを使用する方法の例を示し、それを使用した場合のロード時間と標準のプルテクノロジーを比較しました。

いつものように、ソースコードはGitHubから入手できます。