Весна 5 и Сервлет 4 - PushBuilder
1. Вступление
Технология Server Push - часть HTTP / 2 (RFC 7540) - позволяет нам проактивно отправлять ресурсы клиенту со стороны сервера. Это серьезное отличие от подхода, основанного на использовании HTTP / 1.X.
Одна из новых функций, которые предоставляет Spring 5, - это поддержка push-сервера, которая поставляется с Java EE 8 Servlet 4.0 API. В этой статье мы исследуемhow to use server push and integrate it with Spring MVC controllers.
2. Maven Dependency
Начнем с определения зависимостей, которые мы собираемся использовать:
org.springframework
spring-webmvc
5.0.2.RELEASE
javax.servlet
javax.servlet-api
4.0.0
provided
Самые последние версииspring-mvc иservlet-api можно найти на Maven Central.
3. HTTP/2 Requirements
Для использования server push нам потребуетсяrun our application in a container that supports HTTP/2 and the Servlet 4.0 API. Требования к конфигурации различных контейнеров можно найти здесь, вSpring wiki.
Кроме того, мы будемneed HTTP/2 support on the client-side; конечно, у большинстваcurrent browsersесть такая поддержка.
4. PushBuilder Особенности
ИнтерфейсPushBuilder отвечает за реализацию push-сервера. В Spring MVC мы можем ввестиPushBuilder в качестве аргумента методов, аннотированных@RequestMapping.
На этом этапе важно учитывать, что -if the client doesn’t have HTTP/2 support – the reference will be sent as null.
Вот основной API, предлагаемый интерфейсомPushBuilder:
-
path (String path) – указывает ресурс, который мы собираемся отправить
-
push() – отправляет ресурс клиенту
-
addHeader (String name, String value) – указывает заголовок, который мы будем использовать для отправляемого ресурса.
5. Быстрый пример
Чтобы продемонстрировать интеграцию, мы создадим страницуdemo.jsp с одним ресурсом -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">
Мы также предоставим две конечные точки с контроллеромPushController - одну, которая использует push-уведомления, а другая - нет:
@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, представление и ресурс публикуются и потребляются клиентом с использованием технологии pull:
Когда мы вызываем методdemoWithPush, мы можем видеть использование сервера push и то, как ресурс заранее доставляется сервером, что приводит к меньшему времени загрузки:
Технология server push может улучшить время загрузки страниц наших приложений во многих сценариях. При этом нам нужно учитывать, что, хотя мы уменьшаем задержку, мы можем увеличить пропускную способность - в зависимости от количества ресурсов, которые мы обслуживаем.
Также неплохо объединить эту технологию с другими стратегиями, такими какCaching,Resource Minification и CDN, и запустить тесты производительности в нашем приложении, чтобы определить идеальные конечные точки для использования push-уведомлений сервера.
6. Заключение
В этом кратком руководстве мы увидели пример того, как использовать технологию server push с Spring MVC с использованием интерфейсаPushBuilder, и сравнили время загрузки при его использовании со стандартной технологией pull.
Как всегда доступен исходный кодover on GitHub.