文件

§在應用程式中嵌入 Netty 伺服器

儘管 Play 應用程式最常作為其自己的容器使用,但您也可以將 Play 伺服器嵌入您現有的應用程式中。這可以與 Twirl 範本編譯器和 Play 路由編譯器結合使用,但當然不是必要的。一個常見的用例是只有幾個簡單路由的應用程式。若要使用嵌入式 Netty Server,您需要下列依賴項

libraryDependencies ++= Seq(
  nettyServer
)

啟動 Play Netty Server 的一種方法是使用 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

下一步:常見主題


在此文件檔中找到錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 後,請隨時貢獻一個 pull 要求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開討論。