springboot~http2的支持
<p>在 Spring Boot 应用中开启 HTTP/2 能带来更好的性能体验。下面我会为你解释如何根据不同的需求进行配置。首先,用一个表格来对比两种主要的实现方式:</p><table>
<thead>
<tr>
<th style="text-align: left">特性</th>
<th style="text-align: left">基于 TLS 的 HTTP/2 (h2)</th>
<th style="text-align: left">明文 HTTP/2 (h2c)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong>是否需要证书</strong></td>
<td style="text-align: left">✅ 是(SSL/TLS 证书)</td>
<td style="text-align: left">❌ 否</td>
</tr>
<tr>
<td style="text-align: left"><strong>协议方案</strong></td>
<td style="text-align: left"><code>https</code></td>
<td style="text-align: left"><code>http</code></td>
</tr>
<tr>
<td style="text-align: left"><strong>安全性</strong></td>
<td style="text-align: left">高(加密通信)</td>
<td style="text-align: left">无(明文通信)</td>
</tr>
<tr>
<td style="text-align: left"><strong>浏览器支持</strong></td>
<td style="text-align: left">所有主流浏览器均支持</td>
<td style="text-align: left"><strong>不被浏览器支持</strong></td>
</tr>
<tr>
<td style="text-align: left"><strong>适用场景</strong></td>
<td style="text-align: left">公网网站、对外 API、所有需要浏览器访问的场景</td>
<td style="text-align: left">服务器间通信、内部微服务调用、后端 API(客户端需支持 h2c)</td>
</tr>
</tbody>
</table>
<p>🧩 <strong>前提条件</strong><br>
在开始之前,请确保你的开发环境满足以下要求:</p>
<ul>
<li><strong>JDK 版本</strong>:JDK 9 或更高版本。</li>
<li><strong>Servlet 容器</strong>:使用支持 Servlet 4.0 的容器,例如 <strong>Tomcat 9+</strong>、Undertow 或 Jetty。Spring Boot 2.x 默认带的 Tomcat 通常已满足要求。</li>
</ul>
<hr>
<h3 id="-配置-https-并启用-http2-h2">🔒 配置 HTTPS 并启用 HTTP/2 (h2)</h3>
<p>如果你需要为外部浏览器提供服务,这是标准做法。</p>
<ol>
<li>
<p><strong>生成 SSL 证书</strong><br>
首先需要一个证书。开发测试可以用 Java <code>keytool</code> 生成自签名证书:</p>
<pre><code class="language-bash">keytool -genkey -keyalg RSA -alias mydomain -keystore keystore.jks -storepass yourpassword -validity 365 -keysize 2048
</code></pre>
<p>将生成的 <code>keystore.jks</code> 文件复制到项目的 <code>src/main/resources/</code> 目录下。</p>
</li>
<li>
<p><strong>配置 application.properties/yml</strong><br>
在 <code>application.properties</code> 或 <code>application.yml</code> 中配置 SSL 并启用 HTTP/2:<br>
<strong>application.yml 示例</strong>:</p>
<pre><code class="language-yaml">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 # 证书别名
</code></pre>
<p><strong>application.properties 示例</strong>:</p>
<pre><code class="language-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
</code></pre>
</li>
<li>
<p><strong>启动并验证</strong><br>
启动应用后,用浏览器访问 <code>https://localhost:8443/你的端点</code>。在浏览器开发者工具的 <strong>Network</strong> 选项卡中,查看 <strong>Protocol</strong> 列,通常可以看到 <code>h2</code>(HTTP/2)。</p>
</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/118538/202508/118538-20250826101124960-1375048186.png" alt="图片" loading="lazy"></p>
<hr>
<h3 id="-配置明文-http2-h2c">🔓 配置明文 HTTP/2 (h2c)</h3>
<p>如果你的应用在内部网络通信,或者有支持 h2c 的特定客户端,可以跳过 SSL 步骤。</p>
<h4 id="使用-tomcat-容器">使用 Tomcat 容器</h4>
<p>Spring Boot 默认自带的 Tomcat 开启 HTTP/2 必须使用 SSL,所以需要<strong>重新启一个 Tomcat,并修改其配置,使其支持 HTTP/2.0(Spring Boot 支持多 connector)</strong>。</p>
<p><strong>编程方式配置 Connector</strong>:<br>
创建一个配置类,添加一个支持 h2c 的 <code>Connector</code>:</p>
<pre><code class="language-java">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;
}
}
</code></pre>
<p>应用启动后,<strong>原有的主要连接器(如8080)和新的 h2c 连接器(8081)会同时工作</strong>。你的服务可以通过 <code>http://localhost:8081/你的端点</code> 接受 h2c 请求。</p>
<h4 id="使用-undertow-容器">使用 Undertow 容器</h4>
<p>Undertow 也支持 h2c 和 h2。如果使用 Undertow,需排除默认的 Tomcat 并引入 Undertow 依赖:</p>
<pre><code class="language-xml"><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>
</code></pre>
<p>在配置文件中启用 HTTP/2:<code>server.http2.enabled=true</code>。</p>
<hr>
<h3 id="-验证-http2">✅ 验证 HTTP/2</h3>
<ul>
<li><strong>浏览器 (用于 h2)</strong>:如上所述,通过开发者工具查看。</li>
<li><strong>命令行工具 (如 curl)</strong>:新版本 curl 支持 HTTP/2,可用 <code>curl -k -sI --http2 -I https://localhost:8081/tools/pay?a=1你的端点</code> 测试 h2,或用 <code>curl --http2-prior-knowledge -I https://localhost:8081/tools/pay?a=1</code> 测试 h2c。</li>
<li><strong>程序验证 (用于 h2c)</strong>:可以使用 OkHttp 等支持 h2c 的客户端库编写测试代码。</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/118538/202508/118538-20250826101207348-956859447.png" alt="图片" loading="lazy"></p>
<hr>
<h3 id="️-重要注意事项">⚠️ 重要注意事项</h3>
<ol>
<li><strong>浏览器与 h2c</strong>:<strong>所有主流浏览器都不支持明文的 HTTP/2 (h2c)</strong>。如果为浏览器服务,<strong>必须配置 HTTPS (h2)</strong>。</li>
<li><strong>生产环境证书</strong>:自签名证书仅用于开发和测试。生产环境应使用受信任的证书颁发机构(CA)签名的证书(例如通过阿里云、腾讯云等平台申请免费的或付费的 SSL 证书)。</li>
<li><strong>Spring Boot 版本</strong>:上述配置主要针对 <strong>Spring Boot 2.x</strong> 及更高版本,它们对 HTTP/2 的支持比较完善。对于 Spring Boot 1.5.x,启用 HTTP/2 通常需要更多的编程配置。</li>
<li><strong>HTTP 压缩</strong>:你可以考虑同时启用 HTTP 响应压缩来进一步提升性能:<pre><code class="language-properties">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
</code></pre>
</li>
<li><strong>客户端支持</strong>:确保你的 HTTP 客户端(如其他服务、移动应用等)也支持你想要使用的协议(h2 或 h2c)。</li>
</ol>
<hr>
<h3 id="-选择建议">💡 选择建议</h3>
<p>简单来说:</p>
<ul>
<li>如果你的应用是<strong>网站或需要浏览器访问</strong>,选择 <strong>🔒 配置 HTTPS 并启用 HTTP/2 (h2)</strong>。</li>
<li>如果你的应用是<strong>内部 API、微服务间通信</strong>,且客户端支持 h2c,选择 <strong>🔓 配置明文 HTTP/2 (h2c)</strong> 以简化部署。</li>
</ul>
<p>希望这些信息能帮助你顺利地在 Spring Boot 应用中启用 HTTP/2。</p>
</div>
<div id="MySignature" role="contentinfo">
<p></p>
<div class="navgood">
<p>作者:仓储大叔,张占岭,<br>
荣誉:微软MVP<br>QQ:853066980</p>
<p><strong>支付宝扫一扫,为大叔打赏!</strong>
<br><img src="https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG"></p>
</div><br><br>
来源:https://www.cnblogs.com/lori/p/19058279
頁:
[1]