springboot~http2的支持(chi)
在 Spring Boot 應用中開(kai)啟 HTTP/2 能(neng)帶來(lai)更好的性能(neng)體驗。下(xia)面我會為(wei)你(ni)解釋如何根(gen)據不同的需求(qiu)進行(xing)配置。首先,用一個表格來(lai)對比(bi)兩種主要的實現方式:
| 特性 | 基于 TLS 的 HTTP/2 (h2) | 明文 HTTP/2 (h2c) |
|---|---|---|
| 是否需要證書 | ? 是(SSL/TLS 證書) | ? 否 |
| 協議方案 | https |
http |
| 安全性 | 高(加密通信) | 無(明文通信) |
| 瀏覽器支持 | 所有主流瀏覽器均支持 | 不被瀏覽器支持 |
| 適用場景 | 公網網站、對外 API、所有需要瀏覽器訪問的場景 | 服務器間通信、內部微服務調用、后端 API(客戶端需支持 h2c) |
?? 前提條件
在開始之前,請確保(bao)你的開發環境滿(man)足以(yi)下要(yao)求:
- JDK 版本:JDK 9 或更高版本。
- Servlet 容器:使用支持 Servlet 4.0 的容器,例如 Tomcat 9+、Undertow 或 Jetty。Spring Boot 2.x 默認帶的 Tomcat 通常已滿足要求。
?? 配置 HTTPS 并啟用 HTTP/2 (h2)
如果你需要為(wei)外(wai)部瀏覽(lan)器提(ti)供服務,這(zhe)是標準做法(fa)。
-
生成 SSL 證書
首先需要一個證書。開發測試可以用 Javakeytool生成自簽名證書:keytool -genkey -keyalg RSA -alias mydomain -keystore keystore.jks -storepass yourpassword -validity 365 -keysize 2048將生成的
keystore.jks文件復制到項目的src/main/resources/目錄下。 -
配置 application.properties/yml
在application.properties或application.yml中配置 SSL 并啟用 HTTP/2:
application.yml 示例:server: port: 8443 # HTTPS 默認端口是 443,這里用了 8443 http2: enabled: true # 啟用 HTTP/2 ssl: key-store: classpath:keystore.jks # 證書位置 key-store-password: yourpassword # 密鑰庫密碼 key-store-type: JKS # 密鑰庫類型 key-alias: mydomain # 證書別名application.properties 示例:
server.port=8443 server.http2.enabled=true server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=yourpassword server.ssl.key-store-type=JKS server.ssl.key-alias=mydomain -
啟動并驗證
啟動應用后,用瀏覽器訪問//localhost:8443/你的端點。在瀏覽器開發者工具的 Network 選項卡中,查看 Protocol 列,通常可以看到h2(HTTP/2)。

?? 配置明文 HTTP/2 (h2c)
如果你的(de)應用在內部網絡通信,或者有支持 h2c 的(de)特定客戶端(duan),可以跳過 SSL 步驟。
使用 Tomcat 容器
Spring Boot 默認自帶的 Tomcat 開啟 HTTP/2 必須使用 SSL,所以需要重新啟一個 Tomcat,并修改其配置,使其支持 HTTP/2.0(Spring Boot 支持多 connector)。
編程方式配置 Connector:
創建一個配置類,添加一個支持 h2c 的 Connector:
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http2.Http2Protocol;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class H2cConfig {
// 指定 h2c 端口,例如 8081
private int h2cPort = 8081;
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
// 創建支持 HTTP/1.1 的連接器,NIO 模式
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
// 為該連接器添加 HTTP/2 升級協議
connector.addUpgradeProtocol(new Http2Protocol());
connector.setPort(h2cPort); // 設置連接器端口
factory.addAdditionalTomcatConnectors(connector); // 將連接器添加到工廠
return factory;
}
}
應用啟動后,原有的主要連接器(如8080)和新的 h2c 連接器(8081)會同時工作。你的服務可以通過 //localhost:8081/你的端點 接受 h2c 請求(qiu)。
使用 Undertow 容器
Undertow 也支持 h2c 和(he) h2。如果使用 Undertow,需(xu)排(pai)除默認的 Tomcat 并引入 Undertow 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
在配置文件中啟用 HTTP/2:server.http2.enabled=true。
? 驗證 HTTP/2
- 瀏覽器 (用于 h2):如上所述,通過開發者工具查看。
- 命令行工具 (如 curl):新版本 curl 支持 HTTP/2,可用
curl -k -sI --http2 -I //localhost:8081/tools/pay?a=1你的端點測試 h2,或用curl --http2-prior-knowledge -I //localhost:8081/tools/pay?a=1測試 h2c。 - 程序驗證 (用于 h2c):可以使用 OkHttp 等支持 h2c 的客戶端庫編寫測試代碼。

?? 重要注意事項
- 瀏覽器與 h2c:所有主流瀏覽器都不支持明文的 HTTP/2 (h2c)。如果為瀏覽器服務,必須配置 HTTPS (h2)。
- 生產環境證書:自簽名證書僅用于開發和測試。生產環境應使用受信任的證書頒發機構(CA)簽名的證書(例如通過阿里云、騰訊云等平臺申請免費的或付費的 SSL 證書)。
- Spring Boot 版本:上述配置主要針對 Spring Boot 2.x 及更高版本,它們對 HTTP/2 的支持比較完善。對于 Spring Boot 1.5.x,啟用 HTTP/2 通常需要更多的編程配置。
- HTTP 壓縮:你可以考慮同時啟用 HTTP 響應壓縮來進一步提升性能:
server.compression.enabled=true server.compression.min-response-size=2048 server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json - 客戶端支持:確保你的 HTTP 客戶端(如其他服務、移動應用等)也支持你想要使用的協議(h2 或 h2c)。
?? 選擇建議
簡單來說:
- 如果你的應用是網站或需要瀏覽器訪問,選擇 ?? 配置 HTTPS 并啟用 HTTP/2 (h2)。
- 如果你的應用是內部 API、微服務間通信,且客戶端支持 h2c,選擇 ?? 配置明文 HTTP/2 (h2c) 以簡化部署。
希望這些信息能(neng)幫助你順利(li)地在 Spring Boot 應用中啟(qi)用 HTTP/2。