§在应用程序中嵌入 Pekko Http 服务器
虽然 Play 应用程序最常被用作其自身的容器,但您也可以将 Play 服务器嵌入到您自己的现有应用程序中。这可以与 Twirl 模板编译器和 Play 路由编译器结合使用,但这些当然不是必需的。一个常见的用例是只有一个或几个简单路由的应用程序。要使用嵌入式 Pekko HTTP 服务器,您需要以下依赖项
libraryDependencies ++= Seq(
pekkoHttpServer
)
启动 Play Pekko HTTP 服务器的一种方法是使用 PekkoHttpServer
工厂方法。如果您只需要提供一些简单的路由,您可能决定使用 字符串插值路由 DSL 与 fromRouterWithComponents
方法结合使用
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
系统属性来配置。
另一种方法是通过 GuiceApplicationBuilder
与 fromApplication
方法结合使用来创建 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"
)
)
发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区进行交流。