在我写这篇文章的时候,Play Framework 是v2.6.0-M4。由于 Netty 冲突,该框架的 v2.5 版本难以与 gRPC 一起使用(请参阅此 stackoverflow 答案)。
我开始研究 gRPC 和 protobufs。已经从 Play Framework 2.5 > 2.6.0-M4 移植了一个项目,以期待实际发布。目前我对 gRPC 的集成有一些疑问。我想知道如何让 gRPC 服务器与 Play Framework 一起工作。我知道v2.6 切换到 Akka HTTP 服务器而不是 Netty,而我grpc-netty
在 sbt 中使用依赖项,所以也许我必须再次将项目切换到 Netty(这里是如何)。
出于测试目的,我创建了一个快速而肮脏的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")
}
}
将 gRPC 集成到 Play 框架中的可能解决方案
现在对于 Play Framework v2.6 中的真正集成,我正在寻找建议。这是我可以做的一些事情:
- 创建一个模块并在 Play Framework 启动时启动 gRPC 服务器,如此 stackoverflow answer中所述。这意味着我们在现有服务器旁边的不同端口上运行 gRPC 服务器(Play Framework 2.6 中的 Akka HTTP 服务器)
- 创建一个 Scala 命令并使其长时间运行。因此,当我们在服务器上启动应用程序时,我们始终确保启动运行 gRPC 服务器的命令。
- 在 Play Framework v2.6 中从 Akka HTTP 切换到 Netty,并将 gRPC 与现有的 Netty 服务器紧密集成,因此它可以连接到现有的 Netty 服务器,而不是我们自己创建服务器。我想要这个解决方案,但不知道如何处理它。它肯定会避免运行两个单独的 http 堆栈。
任何关于干净集成的提示/想法都是有帮助的,因为没有太多关于 Play Framework 和 gRPC 的可用信息,除了之前的 2.5 版本中存在问题......