Primavera 5 e Servlet 4 - O PushBuilder
1. Introdução
A tecnologia Server Push - parte do HTTP / 2 (RFC 7540) - nos permite enviar recursos para o cliente de forma proativa do lado do servidor. Essa é uma grande alteração da abordagem baseada em pull HTTP / 1.X.
Um dos novos recursos que o Spring 5 traz - é o suporte a push do servidor fornecido com a API do Java EE 8 Servlet 4.0. Neste artigo, exploraremoshow to use server push and integrate it with Spring MVC controllers.
2. Dependência do Maven
Vamos começar definindo as dependências que vamos usar:
org.springframework
spring-webmvc
5.0.2.RELEASE
javax.servlet
javax.servlet-api
4.0.0
provided
As versões mais recentes despring-mvceservlet-api podem ser encontradas no Maven Central.
3. HTTP/2 Requirements
Para usar push de servidor, precisamosrun our application in a container that supports HTTP/2 and the Servlet 4.0 API. Os requisitos de configuração de vários contêineres podem ser encontrados aqui, emSpring wiki.
Além disso, vamosneed HTTP/2 support on the client-side; claro, a maioria doscurrent browsers tem esse suporte.
4. Recursos dePushBuilder
A interfacePushBuilder é responsável pela implementação de push de servidor. No Spring MVC, podemos injetar umPushBuilder como um argumento dos métodos anotados com@RequestMapping.
Neste ponto, é importante considerar que -if the client doesn’t have HTTP/2 support – the reference will be sent as null.
Aqui está a API principal oferecida pela interfacePushBuilder:
-
path (String path) – indica o recurso que iremos enviar
-
push() – envia o recurso para o cliente
-
addHeader (String name, String value) – indica o cabeçalho que usaremos para o recurso enviado
5. Exemplo rápido
Para demonstrar a integração, criaremos a páginademo.jsp com um recurso -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">
Também exporemos dois endpoints com o controladorPushController - um que usa push de servidor e outro que não:
@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";
}
}
Usando as ferramentas de desenvolvimento do Chrome, podemos ver as diferenças chamando os dois pontos de extremidade.
Quando chamamos o métododemoWithoutPush, a visualização e o recurso são publicados e consumidos pelo cliente usando a tecnologia pull:
Quando chamamos o métododemoWithPush, podemos ver o uso do servidor push e como o recurso é entregue antecipadamente pelo servidor, resultando em um menor tempo de carregamento:
A tecnologia server push pode melhorar o tempo de carregamento das páginas de nossos aplicativos em muitos cenários. Dito isto, precisamos considerar que, embora diminuamos a latência, podemos aumentar a largura de banda - dependendo do número de recursos que servimos.
Também é uma boa ideia combinar essa tecnologia com outras estratégias, comoCaching,Resource Minification e CDN, e executar testes de desempenho em nosso aplicativo para determinar os endpoints ideais para usar push de servidor.
6. Conclusão
Neste tutorial rápido, vimos um exemplo de como usar a tecnologia server push com Spring MVC usando a interfacePushBuilder, e comparamos os tempos de carregamento ao usá-la com a tecnologia pull padrão.
Como sempre, o código-fonte está disponívelover on GitHub.