Интеграция Play Framework 2.6 с gRPC и Netty

На момент написания этой статьи 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 были проблемы...


person JSS    schedule 13.04.2017    source источник
comment
как насчет использования play-grpc?   -  person msbomrel    schedule 03.08.2021