§在應用程式中嵌入 Netty 伺服器
儘管 Play 應用程式最常作為其自己的容器使用,但您也可以將 Play 伺服器嵌入您現有的應用程式中。這可以與 Twirl 範本編譯器和 Play 路由編譯器結合使用,但當然不是必要的。一個常見的用例是只有幾個簡單路由的應用程式。若要使用嵌入式 Netty Server,您需要下列依賴項
libraryDependencies ++= Seq(
nettyServer
)
啟動 Play Netty Server 的一種方法是使用 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
下一步:常見主題
在此文件檔中找到錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 後,請隨時貢獻一個 pull 要求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開討論。