springboot~http2的支持

在 Spring Boot 应用中开启 HTTP/2 能带来更好的性能体验。下面我会为你解释如何根据不同的需求进行配置。首先,用一个表格来对比两种主要的实现方式:

特性基于 TLS 的 HTTP/2 (h2)明文 HTTP/2 (h2c)
是否需要证书✅ 是(SSL/TLS 证书)❌ 否
协议方案httpshttp
安全性高(加密通信)无(明文通信)
浏览器支持所有主流浏览器均支持不被浏览器支持
适用场景公网网站、对外 API、所有需要浏览器访问的场景服务器间通信、内部微服务调用、后端 API(客户端需支持 h2c)

? 前提条件
在开始之前,请确保你的开发环境满足以下要求:

  • JDK 版本:JDK 9 或更高版本。
  • Servlet 容器:使用支持 Servlet 4.0 的容器,例如 Tomcat 9+、Undertow 或 Jetty。Spring Boot 2.x 默认带的 Tomcat 通常已满足要求。

? 配置 HTTPS 并启用 HTTP/2 (h2)

如果你需要为外部浏览器提供服务,这是标准做法。

  1. 生成 SSL 证书
    首先需要一个证书。开发测试可以用 Java keytool 生成自签名证书:

    keytool -genkey -keyalg RSA -alias mydomain -keystore keystore.jks -storepass yourpassword -validity 365 -keysize 2048
    

    将生成的 keystore.jks 文件复制到项目的 src/main/resources/ 目录下。

  2. 配置 application.properties/yml
    application.propertiesapplication.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
    
  3. 启动并验证
    启动应用后,用浏览器访问 https://localhost:8443/你的端点。在浏览器开发者工具的 Network 选项卡中,查看 Protocol 列,通常可以看到 h2(HTTP/2)。


? 配置明文 HTTP/2 (h2c)

如果你的应用在内部网络通信,或者有支持 h2c 的特定客户端,可以跳过 SSL 步骤。

使用 Tomcat 容器

Spring Boot 默认自带的 Tomcat 开启 HTTP/2 必须使用 SSL,所以需要重新启一个 Tomcat,并修改其配置,使其支持 HTTP/2.0(Spring Boot 支持多 connector)

编程方式配置 Connector
创建一个配置类,添加一个支持 h2c 的 Connector