cpp 异步服务器中的 gRPC 多项服务
gRPC multiple services in cpp async server
我知道 gRPC
源代码中有一个示例 helloworld
程序。但是,作为新手,我不明白如何在服务器中编写多个异步服务。示例 here 讨论了生成 class 的新实例来处理 SayHello
服务调用。
- 如何添加新服务,例如
SayBye
,以便我可以从客户端调用它?
- 如何让服务器识别客户端调用了哪个服务?
参见这个
线程 和
有关的
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();
...
我知道 gRPC
源代码中有一个示例 helloworld
程序。但是,作为新手,我不明白如何在服务器中编写多个异步服务。示例 here 讨论了生成 class 的新实例来处理 SayHello
服务调用。
- 如何添加新服务,例如
SayBye
,以便我可以从客户端调用它? - 如何让服务器识别客户端调用了哪个服务?
参见这个
线程 和
有关的
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();
...