Spring 5和Servlet 4 - PushBuilder

2023/05/19

1. 概述

服务器推送技术是HTTP/2(RFC 7540)的一部分,它允许我们从服务器端主动向客户端发送资源。 这是HTTP/1.X基于拉取方法的一个重大变化。

Spring 5带来的新特性之一是Jakarta EE 8 Servlet 4.0 API附带的服务器推送支持。 在本文中,我们介绍如何使用服务器推送并将其与Spring MVC控制器集成。

2. Maven依赖

<!-- @formatter:off -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.13</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<!-- @formatter:on -->

3. HTTP/2 需求

要使用服务器推送,我们需要在支持HTTP/2和Servlet 4.0 API的容器中运行应用程序

此外,我们还需要客户端的HTTP/2支持;当然,目前大多数浏览器都支持这种功能。

4. PushBuilder

PushBuilder接口负责实现服务器推送。在Spring MVC中,我们可以注入PushBuilder作为@RequestMapping注解方法的参数。

此时,重要的是要知道:如果客户端不支持HTTP/2,那么参数引用将作为null传递

以下是PushBuilder接口提供的核心API:

  • path(String path) – 指示我们将要发送的资源
  • push() - 将资源发送到客户端
  • addHeader(String name, String value) - 指示我们将用于推送资源的header

5. 快速案例

为了演示它的使用,我们创建带有一个logo.png的demo.jsp页面。

<%@ 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公开两个端点,一个使用服务器推送,另一个不使用:

@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()方法时,我们可以看到服务器的推送使用情况,以及服务器如何提前交付资源,从而缩短了加载时间:

在许多情况下,服务器推送技术可以缩短应用程序页面的加载时间。 也就是说,我们确实需要考虑,尽管我们减少了延迟,但我们可能会增加带宽,这取决于我们服务的资源数量。

将此技术与缓存、资源最小化和CDN等其他策略相结合,并在应用程序上运行性能测试,以确定使用服务器推送的理想端点。

6. 概述

在本文中,我们演示了如何使用PushBuilder接口将服务器推送技术与Spring MVC结合使用,并比较了使用它与标准拉取技术时的加载时间。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章