1. Введение
Технология Server Push — часть HTTP/2 ( RFC 7540 ) — позволяет нам заранее отправлять ресурсы клиенту со стороны сервера. Это серьезное изменение по сравнению с HTTP/1.X, основанным на запросе.
Одна из новых функций, которые приносит Spring 5, — это поддержка push-уведомлений сервера, которая поставляется с Jakarta EE 8 Servlet 4.0 API. В этой статье мы рассмотрим, как использовать push-уведомление сервера и интегрировать его с контроллерами Spring MVC .
2. Зависимость от Maven
Давайте начнем с определения зависимостей, которые мы собираемся использовать:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
Самые последние версии spring-mvc и servlet-api можно найти на Maven Central.
3. Требования HTTP/2
Чтобы использовать push-уведомление сервера, нам нужно запустить наше приложение в контейнере, который поддерживает HTTP/2 и API Servlet 4.0 . Требования к конфигурации различных контейнеров можно найти здесь, в вики Spring .
Кроме того, нам потребуется поддержка HTTP/2 на стороне клиента ; конечно, большинство современных браузеров имеют эту поддержку.
4. Возможности PushBuilder
Интерфейс PushBuilder
отвечает за реализацию сервера push. В Spring MVC мы можем внедрить PushBuilder
в качестве аргумента методов, аннотированных с помощью @RequestMapping
.
На этом этапе важно учитывать, что — если клиент не поддерживает HTTP/2 — ссылка будет отправлена как null
.
Вот основной API, предлагаемый интерфейсом PushBuilder
:
path (String path) —
указывает ресурс, который мы собираемся отправитьpush() —
отправляет ресурс клиентуaddHeader (строковое имя, строковое значение) —
указывает заголовок, который мы будем использовать для проталкиваемого ресурса.
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"%>
<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
— одну, которая использует 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
, представление и ресурс публикуются и потребляются клиентом с использованием технологии извлечения:
Когда мы вызываем метод demoWithPush
, мы видим использование push-сервера и то, как ресурс заранее доставляется сервером, что приводит к меньшему времени загрузки:
Технология server push может сократить время загрузки страниц наших приложений во многих сценариях. При этом нам нужно учитывать, что, хотя мы уменьшаем задержку, мы можем увеличить пропускную способность — в зависимости от количества обслуживаемых ресурсов.
Также рекомендуется комбинировать эту технологию с другими стратегиями, такими как кэширование , минимизация ресурсов и CDN, а также запускать тесты производительности нашего приложения, чтобы определить идеальные конечные точки для использования push-уведомлений сервера.
6. Заключение
В этом кратком руководстве мы увидели пример использования серверной технологии push с Spring MVC с использованием интерфейса PushBuilder
и сравнили время загрузки при ее использовании со стандартной технологией pull.
Как всегда, исходный код доступен на GitHub .