自Lagom 1.5.0以来,可以使用额外的Play路由器来扩展Lagom服务。
这在将Lagom与现有的Play路由器集成时尤其有用,例如Play gRPC Router ,或者您可以使用的任何其他Play路由器。在连接Lagom服务器时,需要添加一个额外的路由器。在连接Lagom服务器之后,您将附加额外的Play路由器。

  1. override lazy val lagomServer =
  2. serverFor[HelloService](wire[HelloServiceImpl])
  3. .additionalRouter(wire[SomePlayRouter])

文件上传示例

下面的示例显示了如何将文件上载端点添加到现有的Lagom服务。
该示例基于 ScalaSirdRouter ,允许以编程方式构建Play路由器。它添加了一个额外的路径(/api/files),用于接收对多部分表单数据的POST调用。

  1. import play.api.mvc.DefaultActionBuilder
  2. import play.api.mvc.PlayBodyParsers
  3. import play.api.mvc.Results
  4. import play.api.routing.Router
  5. import play.api.routing.sird._
  6. class FileUploadRouter(action: DefaultActionBuilder, parser: PlayBodyParsers) {
  7. val router = Router.from {
  8. case POST(p"/api/files") =>
  9. action(parser.multipartFormData) { request =>
  10. val filePaths = request.body.files.map(_.ref.getAbsolutePath)
  11. Results.Ok(filePaths.mkString("Uploaded[", ", ", "]"))
  12. }
  13. }
  14. }

在应用程序加载器中,可以连接路由器并将其附加到Lagom服务中。

  1. override lazy val lagomServer =
  2. serverFor[HelloService](wire[HelloServiceImpl])
  3. .additionalRouter(wire[FileUploadRouter].router)

路径/api/files将在Lagom服务中提供:

  1. curl -X POST -F "data=@somefile.txt" -v http://localhost:65499/api/files

请注意,在该示例中,我们没有使用服务网关来访问应用程序。我们使用服务端口直接调用它,在本例中为65499。

服务网关注意事项

附加路由器不是应用程序ServiceDescriptor的一部分,因此无法在开发模式下自动作为端点发布到服务网关。如果希望通过网关访问其他路由器,则需要在ServiceDescriptor定义中显式地为其添加ACL(Access Control List,访问控制列表)。

  1. trait HelloService extends Service {
  2. def hello(id: String): ServiceCall[NotUsed, String]
  3. final override def descriptor = {
  4. import Service._
  5. named("hello")
  6. .withCalls(
  7. pathCall("/api/hello/:id", hello _).withAutoAcl(true)
  8. )
  9. .withAcls(
  10. // extra ACL to expose additional router endpoint on ServiceGateway
  11. ServiceAcl(pathRegex = Some("/api/files"))
  12. )
  13. }
  14. }

在服务网关上发布路径后,您可以调用:

  1. curl -X POST -F "data=@somefile.txt" -v http://localhost:9000/api/files

注意9000端口的使用(Lagom的开发模式ServiceGateway)

Lagom客户端注意事项

其他路由器不是服务API的一部分,因此无法从生成的Lagom客户端访问。Lagom客户端只能访问服务特质接口上定义的方法。额外的路由器只是公开的HTTP端点的一部分。要访问,您需要使用HTTP客户端,例如:Play-WS