Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过同一连接访问多个gRPC服务(使用单个通道)_Javascript_Microservices_Grpc_Grpc Node - Fatal编程技术网

Javascript 通过同一连接访问多个gRPC服务(使用单个通道)

Javascript 通过同一连接访问多个gRPC服务(使用单个通道),javascript,microservices,grpc,grpc-node,Javascript,Microservices,Grpc,Grpc Node,请注意,这不是的副本,因为它使用grpc节点。出于某种原因,API中似乎存在差异 我执行创建我的APIPackageDefinitions和APIPackagepObjects的标准过程,并分别从每个客户端创建两个独立的客户端 让grpc=require('grpc')) 让protoLoader=require(“@grpc/protoLoader”) 异步函数createGrcpConnection(){ const HOST='localhost' 常量端口='50053' 常量端口2='

请注意,这不是的副本,因为它使用
grpc节点
。出于某种原因,API中似乎存在差异

我执行创建我的APIPackageDefinitions和APIPackagepObjects的标准过程,并分别从每个客户端创建两个独立的客户端

让grpc=require('grpc'))
让protoLoader=require(“@grpc/protoLoader”)
异步函数createGrcpConnection(){
const HOST='localhost'
常量端口='50053'
常量端口2='50054'
让PhysicalProjectApipackeDefinition=等待protoLoader.load(
'./物理项目api.proto',protoLoaderOptions
)
让configAPIPackageDefinition=等待protoLoader.load(
'./config_api.proto',protoLoaderOptions
)
让PhysicalProjectApipackeObject=grpc.loadPackageDefinition(
PhysicalProjectAPPackageDefinition
).package.v1
让configAPIPackageObject=grpc.loadPackageDefinition(
configAPIPackageDefinition
).package.v1
设grpcClient1=physicalprojectappackageobject.PhysicalProjectAPI(
`${HOST}:${PORT}`,
grpc.credentials.createUnsecure()
)
让grpcClient2=configAPIPackageObject.ConfigAPI(
`${HOST}:${PORT2}`,
grpc.credentials.createUnsecure()
)
返回{GRPClient1,GRPClient2}
}
我正在寻找一种方法来创建共享同一连接的两个客户端。我认为通过创建一个新的
频道
并将最后两个
let
语句替换为

让cc=new grpc.Channel(
`${HOST}:${PORT}`,
grpc.credentials.createUnsecure()
)
设grpcClient1=physicalprojectapipackeobject.PhysicalProjectAPI(cc)
让grpcClient2=configapispackageobject.ConfigAPI(cc)
但是,我收到了一个
类型错误:通道的第一个参数(地址)必须是字符串。我不知道如何合并新实例化的通道来为每个服务创建新的客户端。我在网上找不到任何有用的方法。任何帮助都将不胜感激


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

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

但是,正如前面提到的,有一种方法可以明确地做到这一点。
客户端
构造函数的第三个参数是一个可选对象,具有各种附加选项,包括
channelOverride
。它接受一个
通道
对象,就像您在第二个代码块开始时构造的对象一样。您仍然必须为前两个参数传递有效值,但它们实际上将被忽略,而将使用第三个参数。您可以在中查看有关该构造函数参数的更多信息