Доступ к нескольким службам gRPC через одно и то же соединение (с одним каналом).

Обратите внимание, что это не дубликат похожий вопрос для go, так как здесь используется grpc-node. По какой-то причине кажется, что есть различия в API

Я выполняю стандартную процедуру создания своих APIPackageDefinitions и APIPackagePbjects и создаю два отдельных клиента из каждого по отдельности.

let grpc = require('grpc')
let protoLoader = require('@grpc/proto-loader')

async function createGrcpConnection() {
  const HOST = 'localhost'
  const PORT = '50053'
  const PORT2 = '50054'

  let physicalProjectAPIPackageDefinition = await protoLoader.load(
    './physical_project_api.proto',protoLoaderOptions
  )
  let configAPIPackageDefinition = await protoLoader.load(
    './config_api.proto', protoLoaderOptions
  )

  let physicalProjectAPIPackageObject = grpc.loadPackageDefinition(
    physicalProjectAPIPackageDefinition
  ).package.v1
  let configAPIPackageObject = grpc.loadPackageDefinition(
    configAPIPackageDefinition
  ).package.v1


  let grpcClient1 = physicalProjectAPIPackageObject.PhysicalProjectAPI(
    `${HOST}:${PORT}`,
    grpc.credentials.createInsecure()
  )
  let grpcClient2 = configAPIPackageObject.ConfigAPI(
    `${HOST}:${PORT2}`,
    grpc.credentials.createInsecure()
  )

  return { grpcClient1, grpcClient2 }
}

Я ищу способ создать двух клиентов, которые используют одно и то же соединение. Я думаю, что я близок к решению, создав новый Channel и заменив два последних оператора let на

let cc = new grpc.Channel(
  `${HOST}:${PORT}`,
  grpc.credentials.createInsecure()
)

let grpcClient1 = physicalProjectAPIPackageObject.PhysicalProjectAPI(cc)
let grpcClient2 = configAPIPackageObject.ConfigAPI(cc)

Однако я получил TypeError: Channel's first argument (address) must be a string. Я не уверен, как включить только что созданный экземпляр Channel для создания новых клиентов для каждой службы. Я не смог найти полезных методов в документах. Любая помощь будет оценена по достоинству.

P.S. На данный момент я пытаюсь использовать две службы и создать клиента для каждой службы, и эти два клиента используют соединение на одном и том же канале. Можно ли использовать две службы и создать один клиент для обеих служб? Может быть, я могу использовать пространства имен пакетов .proto в своих интересах здесь? Мой поиск в Интернете не помог мне в этом вопросе.


person edwin    schedule 11.03.2020    source источник


Ответы (1)


Для этого есть API, но он немного более неудобен, чем то, что вы пытались сделать. И вам на самом деле не нужно использовать его, чтобы получить то, что вы хотите. Библиотека grpc внутренне объединяет подключения к одному и тому же серверу, если эти подключения были созданы с одинаковыми параметрами. Таким образом, объекты Client, созданные в вашем первом блоке кода, фактически будут использовать одно и то же TCP-соединение.

Однако, как уже упоминалось, есть способ сделать это явно. Третий аргумент конструктора Client — необязательный объект с различными дополнительными параметрами, включая channelOverride. Это принимает объект Channel, подобный тому, который вы создали в начале вашего второго блока кода. Вы по-прежнему должны передавать допустимые значения для первых двух аргументов, но они фактически будут проигнорированы, и вместо них будет использоваться третий аргумент. Дополнительную информацию об аргументах этого конструктора можно найти в документации API.

person murgatroid99    schedule 11.03.2020