1. 簡介
Server Push 技術——是 HTTP/2 的一部分 (RFC 7540) —— 允許我們主動從服務器端向客户端發送資源。這與 HTTP/1.X 的基於拉取的(pull-based)方法代表了重大變化。
Spring 5 帶來的新功能之一是與 Jakarta EE 8 Servlet 4.0 API 提供的 Server Push 支持。 在本文中,我們將探討 如何使用 Server Push 並將其集成到 Spring MVC 控制器中。
2. Maven 依賴
讓我們首先定義我們將使用的依賴項:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.5</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0-M2</version>
<scope>provided</scope>
</dependency>最新版本的 spring-mvc 和 servlet-api 可在 Maven Central 上找到。
3. HTTP/2 要求
為了使用服務器推送功能,我們需要在支持 HTTP/2 和 Servlet 4.0 API 的容器中運行我們的應用程序。 各種容器的配置要求可以在這裏找到,在 Spring wiki。
此外,我們需要客户端支持 HTTP/2;當然,大多數 當前瀏覽器 已經支持該功能。
4. PushBuilder 功能
PushBuilder 接口負責實現服務器推送。在 Spring MVC 中,我們可以將PushBuilder 作為@RequestMapping 註解方法參數注入。
此時,需要考慮的是——如果客户端不支持 HTTP/2,則引用將被髮送為 null。
以下是PushBuilder 接口提供的核心 API:
- path (String path) – 指示我們將要發送的資源
- push() – 將資源發送到客户端
- addHeader (String name, String value) – 指示我們將用於推送資源的 HTTP 頭
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 控制器 — 一個使用服務器推送,另一個不使用:
@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. 結論
在本快速教程中,我們演示瞭如何使用 Spring MVC 和 PushBuilder 接口來使用服務器推送技術,並對比了使用它與標準拉取技術時的加載時間。