cpp 异步服务器中的 gRPC 多项服务

gRPC multiple services in cpp async server

我知道 gRPC 源代码中有一个示例 helloworld 程序。但是,作为新手,我不明白如何在服务器中编写多个异步服务。示例 here 讨论了生成 class 的新实例来处理 SayHello 服务调用。

  1. 如何添加新服务,例如 SayBye,以便我可以从客户端调用它?
  2. 如何让服务器识别客户端调用了哪个服务?

参见这个 线程 和 有关的 example。 建议在CallData中添加一个bool参数(hello_ in 这个例子),实例化两个 CallData 对象,一个用 hello_ = true,一个用 hello_ = false,并让每个对象请求一个 不同的 RPC。

if (hello_) {
  service_->RequestSayHello(...);
} else {
  service_->RequestSayBye(...);
}

对于两种以上的调用,您可以实现相同的行为 使用 enum 而不是 bool.

更灵活的方法是使用不同的 CallData-like class 每个 RPC。但是,当您从 cq_->Next() 获得标签时,您 知道它是指向这些 classes 之一的对象的指针,但是你 不知道它的确切类型。为了克服这个,你可以拥有它们 从具有虚拟 Proceed() 成员函数的 class 继承, 在每个subclass中根据需要实现它,当你得到一个标签时,将它投射 作为 CallData 并调用 Proceed().

class CallData {
 public:
  virtual void Proceed() = 0;
};

class HelloCallData final : public CallData {...};
class ByeCallData final : public CallData {...};

...
new HelloCallData(...);
new ByeCallData(...);
cq_->Next(&tag, &ok);
static_cast<CallData*>(tag)->Proceed();
...