Spring 5とServlet 4 – プッシュビルダー
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で利用可能]です。