阅读(3547) (0)

Micronaut HTTP/2 支持

2023-02-23 11:27:15 更新

从 Micronaut 2.x 开始,Micronaut 基于 Netty 的 HTTP 服务器可以配置为支持 HTTP/2。

为 HTTP/2 配置服务器

第一步是在服务器配置中设置支持的 HTTP 版本:

启用 HTTP/2 支持

 Properties Yaml  Toml  Groovy  Hocon  JSON 
micronaut.server.http-version=2.0
micronaut:
  server:
    http-version: 2.0
[micronaut]
  [micronaut.server]
    http-version=2.0
micronaut {
  server {
    httpVersion = 2.0
  }
}
{
  micronaut {
    server {
      http-version = 2.0
    }
  }
}
{
  "micronaut": {
    "server": {
      "http-version": 2.0
    }
  }
}

通过此配置,Micronaut 启用了对 h2c 协议的支持(请参阅 HTTP/2 over cleartext),这非常适合开发。

由于浏览器不支持 h2c 和一般的 HTTP/2 over TLS(h2 协议),建议在生产环境中启用 HTTPS 支持。对于开发,这可以通过以下方式完成:

启用 h2 协议支持

 Properties Yaml  Toml  Groovy  Hocon  JSON 
micronaut.server.http-version=2.0
micronaut.server.ssl.enabled=true
micronaut.server.ssl.buildSelfSigned=true
micronaut:
  server:
    http-version: 2.0
    ssl:
      enabled: true
      buildSelfSigned: true
[micronaut]
  [micronaut.server]
    http-version=2.0
    [micronaut.server.ssl]
      enabled=true
      buildSelfSigned=true
micronaut {
  server {
    httpVersion = 2.0
    ssl {
      enabled = true
      buildSelfSigned = true
    }
  }
}
{
  micronaut {
    server {
      http-version = 2.0
      ssl {
        enabled = true
        buildSelfSigned = true
      }
    }
  }
}
{
  "micronaut": {
    "server": {
      "http-version": 2.0,
      "ssl": {
        "enabled": true,
        "buildSelfSigned": true
      }
    }
  }
}

对于生产,请参阅文档的配置 HTTPS 部分。

请注意,如果您的部署环境使用 JDK 8,或者为了改进对 OpenSSL 的支持,请在 Netty Tomcat Native 上定义以下依赖项:

 Gradle Maven 
runtimeOnly("io.netty:netty-tcnative:2.0.58.Final")
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-tcnative</artifactId>
    <version>2.0.58.Final</version>
    <scope>runtime</scope>
</dependency>
 Gradle Maven 
runtimeOnly("io.netty:netty-tcnative-boringssl-static:2.0.58.Final")
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-tcnative-boringssl-static</artifactId>
    <version>2.0.58.Final</version>
    <scope>runtime</scope>
</dependency>

除了对适合您的体系结构的本机库的依赖。例如:

配置 Tomcat 本机

runtimeOnly "io.netty:netty-tcnative-boringssl-static:2.0.58.Final:${Os.isFamily(Os.FAMILY_MAC) ? (Os.isArch("aarch64") ? "osx-aarch_64" : "osx-x86_64") : 'linux-x86_64'}"

有关详细信息,请参阅有关 Tomcat Native 的文档。

HTTP/2 服务器推送支持

Micronaut 框架 3.2 中添加了对服务器推送的支持。服务器推送允许单个请求触发多个响应。这最常用于基于浏览器的资源。目标是改善客户端的延迟,因为他们不必再手动请求该资源,并且可以节省往返时间。

已创建一个新接口 PushCapableHttpRequest 来支持该功能。只需将 PushCapableHttpRequest 参数添加到控制器方法并使用其 API 来触发其他请求。

PushCapableHttpRequest 扩展了 HttpRequest,因此没有必要在控制器方法中将两者都作为参数。

在触发其他请求之前,应调用 isServerPushSupported() 方法以确保该功能可用。一旦知道支持该功能,请使用 serverPush(HttpRequest) 方法触发其他请求。例如:request.serverPush(HttpRequest.GET("/static/style.css")))。