将Play Framework 2.6与gRPC和Netty集成

时间:2017-04-13 21:09:23

标签: scala playframework netty grpc scalapb

在撰写本文时,Play Framework处于 v2.6.0-M4 。由于Netty冲突,框架的v2.5版本难以使用gRPC(参见this stackoverflow answer)。

我开始研究gRPC和protobufs。已经从Play Framework 2.5移植了一个项目> 2.6.0-M4预计实际发布。目前我对gRPC的整合有一些疑问。 我想知道如何让gRPC服务器与Play Framework很好地协同工作。我知道v2.6 switched to Akka HTTP server而不是Netty,而我在sbt中使用grpc-netty依赖,所以也许我将不得不再次将项目切换到Netty(这里是how)。

出于测试目的,我创建了一个快速而脏的GrpcServer.scala类,它启动了一个带有GrpcServer监听的线程。我设法用gRPC添加ScalaPB并生成/编译我的protobufs。它非常适合与小型测试NodeJS应用程序通信,但我必须独立于主项目启动此服务器应用程序:

private def start(): Unit = {
    server = ServerBuilder.forPort(GrpcServer.port).addService(GreeterGrpc.bindService(new GreeterImpl, executionContext)).build.start
    GrpcServer.logger.info("Server started, listening on " + GrpcServer.port)
    sys.addShutdownHook {
        System.err.println("*** shutting down gRPC server")
        self.stop()
        System.err.println("*** server shut down")
    }
}

在Play Framework中集成gRPC的可能解决方案

现在,对于Play Framework v2.6中的真正集成,我正在寻找建议。以下是我可以做的一些事情:

  • 创建module并在Play Framework启动时启动gRPC服务器,如this stackoverflow answer中所述。这意味着我们在现有服务器旁边的不同端口上运行gRPC服务器(来自Play Framework 2.6的Akka HTTP服务器)
  • 创建Scala命令并使其长时间运行。因此,当我们在服务器上启动应用程序时,我们始终确保启动运行gRPC服务器的命令。
  • 在Play Framework v2.6中从Akka HTTP切换到Netty,并将gRPC与现有的Netty服务器紧密集成,以便挂钩到现有的Netty服务器,而不是自己创建服务器。我想要这个解决方案,但不知道如何处理它。它肯定会避免运行两个单独的http堆栈。

有关清洁集成的任何提示/想法都很有帮助,因为除了以前的2.5版本中存在问题外,没有太多关于Play Framework和gRPC的信息...

0 个答案:

没有答案