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