通过同一个连接访问多个 gRPC 服务(使用单个通道)
Access multiple gRPC Services over the same Connection (with a single Channel)
请注意,这 不是 的副本,因为它使用 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 上找不到任何有用的方法。任何帮助将不胜感激。
P.S。目前我正在尝试使用两个服务,并为每个服务创建一个客户端,并让这两个客户端在同一通道上共享一个连接。是否可以使用两种服务,并为两种服务创建一个 单一 客户端?也许我可以在这里使用 .proto 包名称空间来发挥我的优势?我的互联网搜索 fu 在这个问题上失败了。
有一个 API 可以做到这一点,但它比您尝试的要笨拙一些。而且您实际上不需要使用它来获得您想要的东西。 grpc 库在内部将连接汇集到同一服务器,只要这些连接是使用相同的参数创建的。因此,在您的第一个代码块中创建的 Client
个对象实际上将使用相同的 TCP 连接。
但是,如前所述,有一种方法可以明确地做到这一点。 Client
构造函数的第三个参数是一个可选对象,带有各种附加选项,包括 channelOverride
。它接受一个 Channel
对象,就像您在第二个代码块开头构造的对象一样。您仍然必须为前两个参数传递有效值,但它们实际上将被忽略,而将使用第三个参数。您可以在 the API documentation.
中查看有关该构造函数参数的更多信息
请注意,这 不是 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 上找不到任何有用的方法。任何帮助将不胜感激。
P.S。目前我正在尝试使用两个服务,并为每个服务创建一个客户端,并让这两个客户端在同一通道上共享一个连接。是否可以使用两种服务,并为两种服务创建一个 单一 客户端?也许我可以在这里使用 .proto 包名称空间来发挥我的优势?我的互联网搜索 fu 在这个问题上失败了。
有一个 API 可以做到这一点,但它比您尝试的要笨拙一些。而且您实际上不需要使用它来获得您想要的东西。 grpc 库在内部将连接汇集到同一服务器,只要这些连接是使用相同的参数创建的。因此,在您的第一个代码块中创建的 Client
个对象实际上将使用相同的 TCP 连接。
但是,如前所述,有一种方法可以明确地做到这一点。 Client
构造函数的第三个参数是一个可选对象,带有各种附加选项,包括 channelOverride
。它接受一个 Channel
对象,就像您在第二个代码块开头构造的对象一样。您仍然必须为前两个参数传递有效值,但它们实际上将被忽略,而将使用第三个参数。您可以在 the API documentation.