Spring 5 et Servlet 4 - Le PushBuilder

Spring 5 et Servlet 4 - Le PushBuilder

1. introduction

La technologie Server Push - qui fait partie de HTTP / 2 (RFC 7540) - nous permet d'envoyer des ressources au client de manière proactive depuis le serveur. Il s’agit d’un changement majeur par rapport à l’approche HTTP / 1.X à tirage direct.

L’une des nouvelles fonctionnalités de Spring 5 est le support push de serveur fourni avec l’API Java EE 8 Servlet 4.0. Dans cet article, nous allons explorerhow to use server push and integrate it with Spring MVC controllers.

2. Dépendance Maven

Commençons par définir les dépendances que nous allons utiliser:


    org.springframework
    spring-webmvc
    5.0.2.RELEASE


    javax.servlet
    javax.servlet-api
    4.0.0
    provided

Les versions les plus récentes despring-mvc etservlet-api sont disponibles sur Maven Central.

3. HTTP/2 Requirements

Pour utiliser le serveur push, nous aurons besoin derun our application in a container that supports HTTP/2 and the Servlet 4.0 API. Les exigences de configuration de divers conteneurs peuvent être trouvées ici, dans lesSpring wiki.

De plus, nous allonsneed HTTP/2 support on the client-side; bien sûr, la plupart descurrent browsersont ce support.

4. Caractéristiques dePushBuilder

L'interfacePushBuilder est responsable de l'implémentation du serveur push. Dans Spring MVC, nous pouvons injecter unPushBuilder comme argument des méthodes annotées avec@RequestMapping.

À ce stade, il est important de considérer que -if the client doesn’t have HTTP/2 support – the reference will be sent as null.

Voici l'API principale offerte par l'interfacePushBuilder:

  • path (String path) – indique la ressource que nous allons envoyer

  • push() – envoie la ressource au client

  • addHeader (String name, String value) – indique l'en-tête que nous utiliserons pour la ressource poussée

5. Exemple rapide

Pour démontrer l'intégration, nous allons créer la pagedemo.jsp avec une 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">

Nous allons également exposer deux points de terminaison avec le contrôleurPushController - un qui utilise le serveur push et un autre qui ne le fait pas:

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

À l'aide des outils de développement Chrome, nous pouvons voir les différences en appelant les deux points de terminaison.

Lorsque nous appelons la méthodedemoWithoutPush, la vue et la ressource sont publiées et consommées par le client en utilisant la technologie pull:

image Lorsque nous appelons la méthodedemoWithPush, nous pouvons voir l'utilisation du serveur push et comment la ressource est livrée à l'avance par le serveur, ce qui réduit le temps de chargement:

image La technologie serveur push peut améliorer le temps de chargement des pages de nos applications dans de nombreux scénarios. Cela étant dit, nous devons tenir compte du fait que, même si nous réduisons le temps de latence, nous pouvons augmenter la bande passante - en fonction du nombre de ressources que nous servons.

C’est également une bonne idée de combiner cette technologie avec d’autres stratégies telles queCaching,Resource Minification et CDN, et d’exécuter des tests de performances sur notre application afin de déterminer les points de terminaison idéaux pour utiliser le serveur push.

6. Conclusion

Dans ce rapide didacticiel, nous avons vu un exemple d'utilisation de la technologie de serveur push avec Spring MVC à l'aide de l'interfacePushBuilder, et nous avons comparé les temps de chargement lors de son utilisation par rapport à la technologie de traction standard.

Comme toujours, le code source est disponibleover on GitHub.