文档

§在应用程序中嵌入 Pekko Http 服务器

虽然 Play 应用程序最常被用作其自身的容器,但您也可以将 Play 服务器嵌入到您自己的现有应用程序中。这可以与 Twirl 模板编译器和 Play 路由编译器结合使用,但这些当然不是必需的。一个常见的用例是只有一个或几个简单路由的应用程序。要使用嵌入式 Pekko HTTP 服务器,您需要以下依赖项

libraryDependencies ++= Seq(
  pekkoHttpServer
)

启动 Play Pekko HTTP 服务器的一种方法是使用 PekkoHttpServer 工厂方法。如果您只需要提供一些简单的路由,您可能决定使用 字符串插值路由 DSLfromRouterWithComponents 方法结合使用

import play.api.mvc._
import play.api.routing.sird._
import play.core.server.PekkoHttpServer

val server = PekkoHttpServer.fromRouterWithComponents() { components =>
  import Results._
  import components.{ defaultActionBuilder => Action }
  {
    case GET(p"/hello/$to") =>
      Action {
        Ok(s"Hello $to")
      }
  }
}

默认情况下,这将在生产模式下在端口 9000 上启动服务器。您可以通过传入 ServerConfig 来配置服务器

import play.api.mvc._
import play.api.routing.sird._
import play.core.server.PekkoHttpServer
import play.core.server._

val server = PekkoHttpServer.fromRouterWithComponents(
  ServerConfig(
    port = Some(19000),
    address = "127.0.0.1"
  )
) { components =>
  import Results._
  import components.{ defaultActionBuilder => Action }
  {
    case GET(p"/hello/$to") =>
      Action {
        Ok(s"Hello $to")
      }
  }
}

Play 还提供组件特征,使您能够轻松地自定义除路由器之外的其他组件。为此提供了 PekkoHttpServerComponents 特征,并且可以方便地与 BuiltInComponents 结合使用以构建其所需的应用程序。在本例中,我们使用 DefaultPekkoHttpServerComponents,它等效于 PekkoHttpServerComponents with BuiltInComponents with NoHttpFiltersComponents

import play.api.http.DefaultHttpErrorHandler
import play.api.mvc._
import play.api.routing.Router
import play.api.routing.sird._
import play.core.server.DefaultPekkoHttpServerComponents

import scala.concurrent.Future

val components = new DefaultPekkoHttpServerComponents {
  override lazy val router: Router = Router.from {
    case GET(p"/hello/$to") =>
      Action {
        Results.Ok(s"Hello $to")
      }
  }

  override lazy val httpErrorHandler: DefaultHttpErrorHandler = new DefaultHttpErrorHandler(
    environment,
    configuration,
    devContext.map(_.sourceMapper),
    Some(router)
  ) {
    protected override def onNotFound(request: RequestHeader, message: String): Future[Result] = {
      Future.successful(Results.NotFound("Nothing was found!"))
    }
  }
}
val server = components.server

这里您唯一需要实现的方法是 router。其他所有内容都有默认实现,可以通过覆盖方法来定制,例如在上面的 httpErrorHandler 的情况下。服务器配置可以通过覆盖 serverConfig 属性来覆盖。

要停止已启动的服务器,只需调用 stop 方法即可

server.stop()

注意:Play 需要配置 应用程序密钥 才能启动。这可以通过在您的应用程序中提供 application.conf 文件或使用 play.http.secret.key 系统属性来配置。

另一种方法是通过 GuiceApplicationBuilderfromApplication 方法结合使用来创建 Play 应用程序

import play.api.mvc._
import play.api.routing.sird._
import play.core.server.PekkoHttpServer
import play.core.server.ServerConfig
import play.filters.HttpFiltersComponents
import play.api.Environment
import play.api.ApplicationLoader
import play.api.BuiltInComponentsFromContext

val context = ApplicationLoader.Context.create(Environment.simple())
val components = new BuiltInComponentsFromContext(context) with HttpFiltersComponents {
  override def router: Router = Router.from {
    case GET(p"/hello/$to") =>
      Action {
        Results.Ok(s"Hello $to")
      }
  }
}

val server = PekkoHttpServer.fromApplication(
  components.application,
  ServerConfig(
    port = Some(19000),
    address = "127.0.0.1"
  )
)

§日志记录配置

当使用 Pekko HTTP 作为嵌入式服务器时,默认情况下不包含任何日志记录依赖项。如果您想在嵌入式应用程序中添加日志记录,您可以添加 Play logback 模块。

libraryDependencies ++= Seq(
  logback
)

然后调用 LoggerConfigurator API

import play.api.mvc._
import play.api.routing.sird._
import play.filters.HttpFiltersComponents
import play.core.server.PekkoHttpServer
import play.core.server.ServerConfig
import play.api.Environment
import play.api.ApplicationLoader
import play.api.LoggerConfigurator
import play.api.BuiltInComponentsFromContext

val context = ApplicationLoader.Context.create(Environment.simple())
// Do the logging configuration
LoggerConfigurator(context.environment.classLoader).foreach {
  _.configure(context.environment, context.initialConfiguration, Map.empty)
}

val components = new BuiltInComponentsFromContext(context) with HttpFiltersComponents {
  override def router: Router = Router.from {
    case GET(p"/hello/$to") =>
      Action {
        Results.Ok(s"Hello $to")
      }
  }
}

val server = PekkoHttpServer.fromApplication(
  components.application,
  ServerConfig(
    port = Some(19000),
    address = "127.0.0.1"
  )
)

下一步:使用 Netty 服务器嵌入 Play


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