首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个连接(使用单个通道)上访问多个gRPC服务

在同一个连接(使用单个通道)上访问多个gRPC服务
EN

Stack Overflow用户
提问于 2020-03-11 18:34:51
回答 1查看 2.2K关注 0票数 1

注意,这不是一个类似的问题的复制,因为它使用grpc-node。由于某些原因,API似乎存在差异。

我执行创建我的APIPackageDefinitions和APIPackagePbjects的标准过程,并分别从每个客户机创建两个单独的客户机。

代码语言:javascript
复制
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语句替换为

代码语言:javascript
复制
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。我不知道如何合并新实例化的通道来为每个服务创建新的客户端。我在文档上找不到任何有用的方法。任何帮助都将不胜感激。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-11 22:33:43

有一个API可以这样做,但它比您所尝试的要麻烦一些。你不需要用它来得到你想要的。grpc库内部池连接到同一台服务器,只要这些连接是用相同的参数创建的。因此,在第一个代码块中创建的Client对象实际上将使用相同的TCP连接。

但是,如前所述,有一种方法可以显式地做到这一点。Client构造函数的第三个参数是一个带有各种附加选项(包括channelOverride )的可选对象。它接受一个Channel对象,就像您在第二个代码块开始时构建的那样。您仍然必须为前两个参数传递有效值,但实际上它们将被忽略,第三个参数将被使用。您可以在API文档中看到有关该构造函数参数的更多信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60642499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档