Доступ к нескольким сервисам gRP C через одно соединение (с одним каналом) - PullRequest
1 голос
/ 11 марта 2020

Обратите внимание, что это , а не дубликат аналогичный вопрос для 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. Я не уверен, как включить недавно созданный канал для создания новых клиентов для каждого сервиса. Я не смог найти никаких полезных методов на документах . Буду признателен за любую помощь.

PS В настоящее время я пытаюсь использовать две службы и создать клиент для каждой службы, и эти два клиента совместно используют соединение на одном канале. Можно ли использовать два сервиса и создать одного клиента для обоих сервисов? Может быть, я могу использовать пространства имен пакета .proto в моих интересах здесь? Мой inte rnet поиск фу провалил меня в этом вопросе.

1 Ответ

1 голос
/ 12 марта 2020

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

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

...