在 C++ gRPC 中,有没有办法从另一个 gRPC 方法中调用 gRPC 方法?

问题描述 投票:0回答:1

举个例子,如果有一个像这样的原型文件:

syntax = "proto3";
package mypackage;
option java_package = "com.example";

import "google/protobuf/empty.proto";

service MyService {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}

service OtherService {
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}

假设这两个服务是在同一个二进制文件中实现的,当客户端在 MyService.Foo 的实现内部调用 MyService.Foo 时,我想调用 OtherService.Bar 来做某事,这可能吗?如果是的话,怎么办?

c++ grpc
1个回答
0
投票

gRPC 是一种远程过程调用(RPC)机制,即客户端通过网络调用通常在远程服务器上实现的方法|函数。

gRPC 功能包括客户端和服务器之间的(解)编组(通常通过协议缓冲区)以及通过网络的传输。

所调用的只是某种方法|函数(通常在不同的机器上),因此,就像您调用任何其他方法|函数一样,您可以从另一个 gRPC 方法调用一个 gRPC 方法,尽管您通常不需要经过第二个 gRPC 的公共签名并为该函数使用一些本地签名。

有一个问题,第二个 gRPC 方法可能位于第三台机器上,在这种情况下,server1 和 server2 之间存在第二个 RPC,在这种情况下,server1 针对 server2 创建一个 gRPC 客户端,并使得第二个 gRPC 方法调用。

场景#1:客户端调用服务器上的方法1,该方法调用服务器上的另一个方法1

pseudocode
服务器实现这两种服务

namespace MyService {
  function grpcFoo(params) {
    // Convert Proto to local type
    invoke local.doesFoo(params)
    // Convert local type to Proto
    return
  }
}
namespace OtherService {
  function grpcBar(params) {
    // Convert Proto to local type
    invoke local.doesBar(params)
    // Convert local type to Proto
    return
  }
}
namespace local {
  function doesFoo(params) {
    invoke doesBar(params)
    return
  }
  function doesBar(params) {
    // Does something
    return
  }
}

场景#2:客户端调用服务器上的方法1,该方法创建第二个客户端并调用服务器上的方法2

pseudocode
服务器1实现
MyService

namespace MyService {
  function grpcFoo(params) {
    // Create gRPC client against Server #2
    invoke otherservice.grpcBar(params)
    return
  }
}

服务器2实现

OtherService

namespace OtherService {
  function grpcBar(params) {
    // Does something
    return
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.