Перейти к основному содержимому

Spring 5 и Servlet 4 — PushBuilder

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 , представление и ресурс публикуются и потребляются клиентом с использованием технологии извлечения:

./08a01cd54b853eaa4887a18476739937.png

Когда мы вызываем метод demoWithPush , мы видим использование push-сервера и то, как ресурс заранее доставляется сервером, что приводит к меньшему времени загрузки:

./2b54600e19fadbc8a32854a72cfc5aa4.png

Технология server push может сократить время загрузки страниц наших приложений во многих сценариях. При этом нам нужно учитывать, что, хотя мы уменьшаем задержку, мы можем увеличить пропускную способность — в зависимости от количества обслуживаемых ресурсов.

Также рекомендуется комбинировать эту технологию с другими стратегиями, такими как кэширование , минимизация ресурсов и CDN, а также запускать тесты производительности нашего приложения, чтобы определить идеальные конечные точки для использования push-уведомлений сервера.

6. Заключение

В этом кратком руководстве мы увидели пример использования серверной технологии push с Spring MVC с использованием интерфейса PushBuilder и сравнили время загрузки при ее использовании со стандартной технологией pull.

Как всегда, исходный код доступен на GitHub .