1前書き

HTTP/2(https://tools.ietf.org/html/rfc7540#section-8.2[RFC 7540])の一部であるサーバープッシュテクノロジを使用すると、サーバー側から積極的にクライアントにリソースを送信できます。これはHTTP/1.Xプルベースのアプローチからの大きな変更点です。

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


2 Mavenの依存関係

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

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


spring-mvc

の最新バージョンhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22javax.servlet%22%20AND%20a%3A%22javax.servlet-api%22[servlet-api]は、 Maven Centralで見つけました。


3 HTTP/2の要件

サーバープッシュを使用するには、HTTP/2とServlet 4.0 APIをサポートするコンテナでアプリケーションを実行する必要があります。

Spring wiki

には、さまざまなコンテナの設定要件があります。

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


4

PushBuilder

の機能


PushBuilder

インターフェースは、サーバープッシュの実装を担当します。

Spring MVCでは、

@ RequestMapping

のアノテーションが付けられたメソッドの引数として

PushBuilder

を注入することができます。

この時点で、考慮することが重要です。

クライアントがHTTP/2をサポートしていない場合は、参照は

null


として送信されます。

これは、

PushBuilder

インターフェースによって提供されるコアAPIです。


  • path(String path) –

    は、送信しようとしているリソースを示します。


  • push()–

    はリソースをクライアントに送信します


  • addHeader(String name、String value) –

    は、そのヘッダを示します。

プッシュされたリソースに使用します


5簡単な例

統合を実証するために、

logo.png

という1つのリソースで

demo.jsp

ページを作成します。

<%@ 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

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


/uploads/Demo-without-Push-300×52.png%20300w


demoWithPush

メソッドを呼び出すと、プッシュサーバーの使用方法とリソースがサーバーによって事前に配信される方法がわかります。ロード時間:


/uploads/Demo-with-Push-300×51.png%20300w

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

この技術と他の戦略、例えばリンクを使うこともお勧めです。[Minification]、およびCDNを使用して、サーバープッシュを使用するための理想的なエンドポイントを決定するために、アプリケーションでパフォーマンステストを実行します。


6. 結論

このクイックチュートリアルでは、

PushBuilder

インターフェイスを使用してSpring MVCでサーバープッシュテクノロジを使用する方法の例を見て、使用時のロード時間と標準のプルテクノロジを比較しました。

いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-simple[GitHubで利用可能]です。