Интеграция 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 были проблемы...

0 ответов

Другие вопросы по тегам