知識庫 / Spring / Spring Boot RSS 訂閱

使用 Tomcat 在 Spring Boot 中啓用 HTTP/2

Spring Boot
HongKong
4
10:49 AM · Dec 06 ,2025

1. 概述

HTTP/2 是廣泛使用的 HTTP/1.1 協議的後繼者,通過採用諸如多路複用和頭部壓縮等新功能,從而提高了 Web 性能。

在本教程中,我們將描述如何配置我們的 Spring Boot 應用程序,以便在嵌入式 Tomcat 服務器上啓用 HTTP/2。

2. HTTP/2

超文本傳輸協議 (HTTP) 是一種用於在互聯網上獲取資源的應用程序協議。HTTP/1.1 於 1997 年 1 月發佈,並且在過去二十多年中服務了大部分 Web。此版本解決了在某些場景中導致性能緩慢的問題。

HTTP/2 通過以下特性克服了 HTTP/1.1 中的性能問題:

  • 多路複用 – HTTP/1.1 使用多個連接發送多個請求;多路複用允許在單個連接上發送請求,從而減少資源消耗和延遲
  • 壓縮報頭 – 在沒有壓縮的情況下,由於 TCP 的慢啓動,通常需要多次往返才能發送報頭;壓縮報頭可確保報頭在大多數情況下在一次往返中發送
  • 二進制 – HTTP/2 以二進制格式發送數據,以減少解析開銷並使消息大小小於 HTTP/1.1,後者使用文本編碼的數據

3. 先決條件

HTTP/2 可以通過未加密方式或 TLS 運行。 大多數 Web 瀏覽器不支持 HTTP/2 通過未加密方式運行,因此我們建議通過 TLS 運行它。 我們首先將在嵌入式 Web 服務器上啓用 SSL。

讓我們生成一個 keystore 以存儲用於 SSL/TLS 的密鑰和證書,並將其放入嵌入式 Tomcat 中。 我們將在控制枱中運行以下 keytool 以生成它:

$ keytool -genkeypair -alias http2-alias -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650

keytool 將會要求我們提供一個密碼,稍後我們將使用該密碼添加到 Spring Boot 配置中。完成該過程後,工具將生成 keystore.p12 文件。我們將複製該文件到我們 Spring Boot 應用程序的 resources 文件夾下。

現在,我們需要將以下屬性添加到 application.yml 以啓用嵌入式 Tomcat 中的 HTTPS:

server:
  ssl:
    enabled: true
    key-store: classpath:keystore.p12
    key-store-password: <your-password>
    key-store-type: PKCS12
    key-alias: http2-alias

4. 檢查響應中的 HTTP 協議版本

默認情況下,Spring Boot 內嵌的 Tomcat 不會啓用 HTTP/2 協議來處理請求。 讓我們創建一個簡單的 Spring Boot REST 端點來驗證這一點:

@RestController
public class Http2Controller {
    @GetMapping("/http2/echo")
    public String getChatbotResponse(@RequestParam String message) {
        return message;
    }
}

這個端點僅接受一個請求參數 message,並將它返回在響應體中。

在啓動我們的應用程序後,我們可以使用以下 curl 命令在控制枱中執行,並使用 –http2 選項來通過 HTTP/2 調用該端點:

$ curl -I --http2 http://localhost:8080/http2/echo?message=hello

-I 論點向我們展示了附加信息,例如在響應中 HTTP 協議版本。從打印輸出中,我們可以看到應用程序返回:

HTTP/1.1 200

或者,我們還可以使用 Postman 來驗證協議版本。 從版本 11.8 開始,它支持 HTTP/2 協議,發送 HTTP 請求的協議版本仍然是 HTTP/1.1 默認值。 您可以在“設置”選項卡中更改協議版本:

發送請求後,我們可以從 Postman 控制枱的原始日誌中找到 HTTP 協議版本:

無論我們是否在 HTTP/2 中發送了請求,curl 和 Postman 都會返回 HTTP/1.1 響應。

5. 在 Spring Boot 中啓用 HTTP/2

現在,讓我們在嵌入式 Tomcat 中啓用 HTTP/2。在 Spring Boot 應用程序中啓用 HTTP/2 有兩種方法。

第一種方法是通過定義一個配置類,將 Http2Protocol 類添加到 Tomcat HTTP 連接器中:

@Configuration
public class Http2Config {
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> getWebServerFactoryCustomizer() {
        return factory -> {
            Connector httpConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            httpConnector.setPort(8080);
            factory.addConnectorCustomizers(connector -> connector.addUpgradeProtocol(new Http2Protocol()));
            factory.addAdditionalTomcatConnectors(httpConnector);
        };
    }
}

此配置類自定義嵌入式 Tomcat 服務器,並啓用 HTTP/2 支持,通過向 HTTP 連接器添加 Http2Protocol 升級來實現。

此配置會打開額外的端口 8080,用於運行 HTTP,除了現有的 8443 端口,該端口使用 SSL 運行 HTTP/2。

第二種方法更簡單。只需在 application.yml 中將 server.http2.enabled 屬性標記為 true 即可。

server:
  http2:
    enabled: true

一旦應用重啓並應用了任一方案,我們就可以執行相同的 curl 命令來查詢 REST 端點;我們將會收到以下響應,顯示 HTTP/2 已啓用:

HTTP/2 200

如果我們再次使用 Postman 發送請求,將會看到以下響應:

6. 結論

HTTP/1.1 長期以來一直是傳遞 HTTP 請求的主流協議,而 HTTP/2 則提供了更好的資源效率和更低的延遲。 這是一項重大進步,對於現代 Web 應用程序來説,也是一個顯著的升級。

要使用 HTTP/2 協議運行 Spring Boot 應用程序,我們需要在 Spring Boot 應用程序中啓用 SSL 和 HTTP/2 設置。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.