Интеграция Play Framework 2.6 с gRPC и Netty
В то время, когда я пишу этот пост, Play Framework находится на v2.6.0-M4. Версия платформы v2.5 имела трудности для работы с gRPC из-за конфликтов Netty (см. Этот ответ stackru).
Я начинаю изучать gRPC и protobufs. Уже портировал проект из Play Framework 2.5 > 2.6.0-M4 в ожидании фактического релиза. В настоящее время у меня есть несколько вопросов относительно интеграции gRPC. Мне интересно, как позволить серверу gRPC хорошо работать вместе с Play Framework. Я знаю, что v2.6 переключился на HTTP-сервер Akka вместо Netty, хотя я использую grpc-netty
зависимость в sbt, так что, возможно, мне придется снова переключить проект на Netty (вот как).
В целях тестирования я создал быстрый и грязный GrpcServer.scala
класс, который запускает поток с прослушиванием GrpcServer. Мне удалось добавить ScalaPB с помощью gRPC и сгенерировать / скомпилировать мои 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 Framework
Теперь для реальной интеграции в Play Framework v2.6, я ищу предложения. Вот несколько вещей, которые я могу сделать:
- Создайте модуль и запустите сервер gRPC при запуске Play Framework, как описано в этом ответе на stackru. Это будет означать, что мы запускаем сервер gRPC на другом порту рядом с существующим сервером (HTTP-сервер Akka из Play Framework 2.6)
- Создайте команду Scala и сделайте ее долгосрочным. Поэтому мы всегда должны запускать команду, которая запускает сервер gRPC, когда мы запускаем наше приложение на сервере.
- Переключитесь с Akka HTTP на Netty в Play Framework v2.6 и плотно интегрируйте gRPC с существующим сервером Netty, чтобы он подключался к существующему серверу Netty вместо того, чтобы создавать собственный сервер. Я хотел бы это решение, но не уверен, как с ним бороться. Это определенно позволило бы избежать запуска двух отдельных http-стеков.
Любые советы / идеи для чистой интеграции полезны, так как не так много информации о Play Framework и gRPC, за исключением того, что в предыдущей версии 2.5 были проблемы...