Spring 5 und Servlet 4 - Der PushBuilder

Feder 5 und Servlet 4 - Der PushBuilder

1. Einführung

Die Server Push-Technologie - Teil von HTTP / 2 (RFC 7540) - ermöglicht es uns, Ressourcen proaktiv von der Serverseite an den Client zu senden. Dies ist eine wesentliche Änderung gegenüber dem Pull-basierten HTTP / 1.X-Ansatz.

Eine der neuen Funktionen von Spring 5 ist die Server-Push-Unterstützung, die mit der Java EE 8 Servlet 4.0-API geliefert wird. In diesem Artikel werden wirhow to use server push and integrate it with Spring MVC controllers untersuchen.

2. Maven-Abhängigkeit

Beginnen wir mit der Definition der Abhängigkeiten, die wir verwenden werden:


    org.springframework
    spring-webmvc
    5.0.2.RELEASE


    javax.servlet
    javax.servlet-api
    4.0.0
    provided

Die neuesten Versionen vonspring-mvc undservlet-api finden Sie in Maven Central.

3. HTTP/2 Requirements

Um Server-Push verwenden zu können, benötigen wirrun our application in a container that supports HTTP/2 and the Servlet 4.0 API. Die Konfigurationsanforderungen für verschiedene Container finden Sie hier inSpring wiki.

Zusätzlich werden wirneed HTTP/2 support on the client-side; Natürlich haben die meistencurrent browsersdiese Unterstützung.

4. PushBuilder Funktionen

DiePushBuilder-Schnittstelle ist für die Implementierung des Server-Push verantwortlich. In Spring MVC können wir einPushBuilder als Argument für die mit@RequestMapping annotierten Methoden einfügen.

An dieser Stelle ist es wichtig zu berücksichtigen, dass -if the client doesn’t have HTTP/2 support – the reference will be sent as null.

Hier ist die Kern-API, die von derPushBuilder-Schnittstelle angeboten wird:

  • path (String path) – gibt die Ressource an, die gesendet werden soll

  • push() – sendet die Ressource an den Client

  • addHeader (String name, String value) – gibt den Header an, den wir für die Push-Ressource verwenden

5. Schnelles Beispiel

Um die Integration zu demonstrieren, erstellen wir die Seitedemo.jspmit einer Ressource -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"%>



PushBuilder demo


    PushBuilder demo
    
" alt="Logo" height="126" width="411">

Wir werden auch zwei Endpunkte mit demPushController-Controller verfügbar machen - einen, der Server-Push verwendet, und einen, der dies nicht tut:

@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";
    }
}

Mit den Chrome-Entwicklungstools können wir die Unterschiede erkennen, indem wir beide Endpunkte aufrufen.

Wenn wir diedemoWithoutPush-Methode aufrufen, werden die Ansicht und die Ressource vom Client mithilfe der Pull-Technologie veröffentlicht und verwendet:

image Wenn wir die MethodedemoWithPush aufrufen, können wir sehen, wie der Push-Server verwendet wird und wie die Ressource vom Server im Voraus bereitgestellt wird, was zu einer geringeren Ladezeit führt:

image Die Server-Push-Technologie kann in vielen Szenarien die Ladezeit der Seiten unserer Anwendungen verbessern. Abgesehen davon müssen wir berücksichtigen, dass wir, obwohl wir die Latenz verringern, die Bandbreite erhöhen können - abhängig von der Anzahl der von uns bereitgestellten Ressourcen.

Es ist auch eine gute Idee, diese Technologie mit anderen Strategien wieCaching,Resource Minification und CDN zu kombinieren und Leistungstests für unsere Anwendung durchzuführen, um die idealen Endpunkte für die Verwendung von Server-Push zu ermitteln.

6. Fazit

In diesem kurzen Tutorial haben wir ein Beispiel für die Verwendung der Server-Push-Technologie mit Spring MVC unter Verwendung derPushBuilder-Schnittstelle gesehen und die Ladezeiten bei Verwendung mit der Standard-Pull-Technologie verglichen.

Wie immer ist der Quellcodeover on GitHub verfügbar.