Весна 5 и Сервлет 4 - PushBuilder

Весна 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:

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

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

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

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

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

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