springboot~http2的支持

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

特性 基于 TLS 的 HTTP/2 (h2) 明文 HTTP/2 (h2c)
是否需要证书 是(SSL/TLS 证书)
协议方案 https http
安全性 高(加密通信) 无(明文通信)
浏览器支持 所有主流浏览器均支持 不被浏览器支持
适用场景 公网网站、对外 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

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 容器

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


验证 HTTP/2

  • 浏览器 (用于 h2):如上所述,通过开发者工具查看。
  • 命令行工具 (如 curl):新版本 curl 支持 HTTP/2,可用 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。
  • 程序验证 (用于 h2c):可以使用 OkHttp 等支持 h2c 的客户端库编写测试代码。


️ 重要注意事项

  1. 浏览器与 h2c所有主流浏览器都不支持明文的 HTTP/2 (h2c)。如果为浏览器服务,必须配置 HTTPS (h2)
  2. 生产环境证书:自签名证书仅用于开发和测试。生产环境应使用受信任的证书颁发机构(CA)签名的证书(例如通过阿里云、腾讯云等平台申请免费的或付费的 SSL 证书)。
  3. Spring Boot 版本:上述配置主要针对 Spring Boot 2.x 及更高版本,它们对 HTTP/2 的支持比较完善。对于 Spring Boot 1.5.x,启用 HTTP/2 通常需要更多的编程配置。
  4. 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
    
  5. 客户端支持:确保你的 HTTP 客户端(如其他服务、移动应用等)也支持你想要使用的协议(h2 或 h2c)。

选择建议

简单来说:

  • 如果你的应用是网站或需要浏览器访问,选择 配置 HTTPS 并启用 HTTP/2 (h2)
  • 如果你的应用是内部 API、微服务间通信,且客户端支持 h2c,选择 配置明文 HTTP/2 (h2c) 以简化部署。

希望这些信息能帮助你顺利地在 Spring Boot 应用中启用 HTTP/2。

来源链接:https://www.cnblogs.com/lori/p/19058279

© 版权声明
THE END
支持一下吧
点赞10 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容