§在应用程序中嵌入 Netty 服务器
虽然 Play 应用程序最常被用作它们自己的容器,但您也可以将 Play 服务器嵌入到您现有的应用程序中。这可以与 Twirl 模板编译器和 Play 路由编译器结合使用,但这些当然不是必需的。一个常见的用例是只有几个简单路由的应用程序。要使用嵌入式 Netty 服务器,您需要以下依赖项
libraryDependencies ++= Seq(
nettyServer
)
启动 Play Netty 服务器的一种方法是使用 NettyServer
工厂方法。如果您只需要提供一些简单的路由,您可以选择使用 字符串插值路由 DSL 与 fromRouterWithComponents
方法结合使用
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
下一步:常见主题
发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。