На момент написания этой статьи Play Framework находился на уровне v2.6.0-M4. Версия платформы v2.5 не могла работать с gRPC из-за конфликтов Netty (см. этот ответ stackoverflow).
Я начинаю изучать 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, как описано в этот ответ stackoverflow. Это будет означать, что мы запускаем сервер 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 были проблемы...