1

请注意,这不是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 来为每个服务创建新客户端。我在docs上找不到任何有用的方法。任何帮助,将不胜感激。

PS 目前我正在尝试使用两个服务,并为每个服务创建一个客户端,并让这两个客户端在同一通道上共享一个连接。是否可以使用两个服务,并为这两个服务创建一个客户端?也许我可以在这里使用 .proto 包命名空间来发挥我的优势?我的互联网搜索让我在这个问题上失败了。

4

1 回答 1

2

有一个 API 可以做到这一点,但它比你尝试的要尴尬一些。而且您实际上并不需要使用它来获得您想要的东西。只要这些连接是使用相同的参数创建的,grpc 库就会在内部汇集到同一服务器的连接。因此,Client在您的第一个代码块中创建的对象实际上将使用相同的 TCP 连接。

但是,如前所述,有一种方法可以明确地执行此操作。构造函数的第三个参数Client是带有各种附加选项的可选对象,包括channelOverride. 它接受一个Channel像您在第二个代码块开头构造的对象。您仍然必须为前两个参数传递有效值,但实际上它们将被忽略,而将使用第三个参数。您可以在API 文档中查看有关该构造函数参数的更多信息。

于 2020-03-11T22:33:43.033 回答