文档

§Pekko HTTP 服务器后端

Play 使用 Pekko HTTP 服务器后端通过网络上的 Pekko 流实现 HTTP 请求和响应。Pekko HTTP 为 HTTP 实现了一个完整的服务器堆栈,包括完整的 HTTPS 支持,并支持 HTTP/2。

Pekko HTTP 服务器后端是 Play 中的默认后端。您也可以选择使用 Netty 后端

§Pekko HTTP 实现

Play 的服务器后端使用 低级服务器 API 处理 Pekko 的 HttpRequestHttpResponse 类。

Play 的服务器后端会自动将 Pekko 的 HttpRequest 转换为 Play HTTP 请求,因此实现细节在幕后。Play 处理围绕服务器后端的路由和应用程序逻辑,同时仍然提供 Pekko-HTTP 的强大功能和可靠性来处理请求。

§使用阻塞 API

与 Play 的其他部分一样,Pekko HTTP 是非阻塞的。这意味着它使用少量线程,这些线程始终保持工作负载。

当使用 JDBC 或 HTTPURLConnection 等阻塞 API 时,这会带来问题,这些 API 会导致线程等待数据从远程系统返回。

请使用 FutureCompletionStage 配置的 CustomExecutionContext 并使用在 ThreadPools 中定义的自定义线程池,在主渲染线程之外配置任何使用阻塞 API 的工作。有关更多详细信息,请参阅 JavaAsyncScalaAsync

§配置 Pekko HTTP

可以为 Pekko HTTP 服务器配置多种选项。这些选项在 配置 Pekko HTTP 的文档 中给出。

§HTTP/2 支持(孵化中)

Play 的 Pekko HTTP 服务器也支持 HTTP/2。此功能被标记为“孵化中”,因为 API 可能会在将来发生变化,并且尚未在实际环境中得到充分测试。但是,如果您想帮助 Play 改进,请测试 HTTP/2 支持并向我们提供有关您体验的反馈。

您还应该在启用 HTTP/2 之前在服务器上配置 HTTPS。通常,浏览器需要 TLS 才能与 HTTP/2 协同工作,而 Play 的 Pekko HTTP 服务器使用 ALPN(TLS 扩展)与支持它的客户端协商协议。

要添加对 HTTP/2 的支持,请添加 PlayPekkoHttp2Support 插件。您可以在 build.sbt 中的项目 enablePlugins 调用中执行此操作,例如

lazy val root = (project in file("."))
  .enablePlugins(PlayScala, PlayPekkoHttp2Support)

添加插件将添加 play-pekko-http2-support 模块,该模块提供 HTTP/2 的附加配置。默认情况下,HTTP/2 已启用,但可以通过传递 http2.enabled 系统属性来禁用它,例如 play "start -Dhttp2.enabled=no"

您可能需要编写一个简单的脚本以使用所需的选项运行您的应用程序,如 play-scala-tls-example 项目中的 ./play 脚本所示。

提示:使用 nghttp2 对您的应用程序运行 HTTP/2 请求。

§手动选择 Pekko HTTP 服务器

如果由于某种原因,您的类路径上同时存在 Pekko HTTP 和 Netty 服务器 JAR,那么 Play 将无法预测地选择服务器后端。您需要手动选择 Pekko HTTP 服务器。这可以通过显式覆盖 play.server.provider 配置选项并将其设置为 play.core.server.PekkoHttpServerProvider 的值来完成。

play.server.provider 配置设置可以与其他配置选项以相同的方式设置。在配置文件文档中描述了设置配置的不同方法。下面显示了启用 Pekko HTTP 服务器后端的几个示例。

推荐的做法是将设置添加到两个地方。首先,要为 sbt run 任务启用 Pekko HTTP,请将以下内容添加到您的 build.sbt

PlayKeys.devSettings += "play.server.provider" -> "play.core.server.PekkoHttpServerProvider"

其次,要为部署应用程序或使用 sbt start 任务时启用 Pekko HTTP 后端,请将以下内容添加到您的 application.conf 文件中

play.server.provider = play.core.server.PekkoHttpServerProvider

通过将设置添加到 build.sbtapplication.conf 中,您可以确保在所有情况下都将使用 Pekko HTTP 后端。

下一步:使用 Netty 服务器的 Play


在此文档中发现错误?此页面的源代码可以在此处找到。阅读文档指南后,请随时贡献拉取请求。有疑问或建议要分享?转到我们的社区论坛,与社区开始对话。