文档

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

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

libraryDependencies ++= Seq(
  nettyServer
)

启动 Play Netty 服务器的一种方法是使用 NettyServer 工厂方法。如果您只需要提供一些简单的路由,您可以选择使用 字符串插值路由 DSLfromRouterWithComponents 方法结合使用

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

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

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

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

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

Play 还提供组件特征,使您可以轻松地自定义除路由器之外的其他组件。为此提供了 NettyServerComponents 特征,并且可以方便地与 BuiltInComponents 结合使用以构建它所需的应用程序。在本例中,我们使用 DefaultNettyServerComponents,它等效于 NettyServerComponents 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._

import scala.concurrent.Future

val components = new DefaultNettyServerComponents {
  lazy val 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.successful(Results.NotFound("Nothing was found!"))
      }
    }
}
val server = components.server

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

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

server.stop()

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

§日志记录配置

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

libraryDependencies ++= Seq(
  logback
)

然后调用 LoggerConfigurator API

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

val environment = Environment.simple(mode = Mode.Prod)
val context     = ApplicationLoader.Context.create(environment)

// Do the logging configuration
LoggerConfigurator(context.environment.classLoader).foreach {
  _.configure(context.environment, context.initialConfiguration, Map.empty)
}

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

val server = components.server

下一步:常见主题


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