时间:2025-08-26 10:13
人气:
作者:admin
在 Spring Boot 应用中开启 HTTP/2 能带来更好的性能体验。下面我会为你解释如何根据不同的需求进行配置。首先,用一个表格来对比两种主要的实现方式:
| 特性 | 基于 TLS 的 HTTP/2 (h2) | 明文 HTTP/2 (h2c) |
|---|---|---|
| 是否需要证书 | ✅ 是(SSL/TLS 证书) | ❌ 否 |
| 协议方案 | https |
http |
| 安全性 | 高(加密通信) | 无(明文通信) |
| 浏览器支持 | 所有主流浏览器均支持 | 不被浏览器支持 |
| 适用场景 | 公网网站、对外 API、所有需要浏览器访问的场景 | 服务器间通信、内部微服务调用、后端 API(客户端需支持 h2c) |
???? 前提条件
在开始之前,请确保你的开发环境满足以下要求:
如果你需要为外部浏览器提供服务,这是标准做法。
生成 SSL 证书
首先需要一个证书。开发测试可以用 Java keytool 生成自签名证书:
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
启动并验证
启动应用后,用浏览器访问 https://localhost:8443/你的端点。在浏览器开发者工具的 Network 选项卡中,查看 Protocol 列,通常可以看到 h2(HTTP/2)。

如果你的应用在内部网络通信,或者有支持 h2c 的特定客户端,可以跳过 SSL 步骤。
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)会同时工作。你的服务可以通过 http://localhost:8081/你的端点 接受 h2c 请求。
Undertow 也支持 h2c 和 h2。如果使用 Undertow,需排除默认的 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。
curl -k -sI --http2 -I https://localhost:8081/tools/pay?a=1你的端点 测试 h2,或用 curl --http2-prior-knowledge -I https://localhost:8081/tools/pay?a=1 测试 h2c。
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
简单来说:
希望这些信息能帮助你顺利地在 Spring Boot 应用中启用 HTTP/2。
作者:仓储大叔,张占岭,
荣誉:微软MVP
QQ:853066980
支付宝扫一扫,为大叔打赏!
