服务器端流RPC模式
在一元 RPC 模式中,gRPC 服务器端和 gRPC 客户端在通信时始终只有一个请求和一个响应。在服务器端流 RPC 模式中,服务器端在接收到客户端的请求消息后,会发回一个响应的序列。这种多个响应所组成的序列也被称为"流"。在将所有的服务器端响应发送完毕之后,服务器端会以 trailer 元数据的形式将其状态发送给客户端,从而标记流的结束。
c++ 实现服务器端主动推送消息
在gRPC中,服务端主动向客户端发送数据通常是通过服务器端流式RPC实现的。在这种模式下,客户端发送一个请求到服务器,获取一个读取服务端流的响应。这种模式可以让服务器主动推送消息给客户端。
以下是一个C++的例子,展示了一个简单的服务器端流式RPC的实现:
cpp
// .proto file
service MyService {
rpc MyStreamingMethod(MyRequest) returns (stream MyResponse);
}
// Server implementation
class MyServiceImpl final : public MyService::Service {
Status MyStreamingMethod(const MyRequest* request, ServerWriter<MyResponse>* writer) override {
MyResponse response;
for (int i = 0; i < 10; ++i) {
response.set_data("Data " + std::to_string(i));
writer->Write(response);
}
return Status::OK;
}
};
// Client implementation
void MyClient::MyStreamingMethod() {
MyRequest request;
request.set_data("Hello");
ClientContext context;
std::unique_ptr<ClientReader<MyResponse>> reader(
stub_->MyStreamingMethod(&context, request));
MyResponse response;
while (reader->Read(&response)) {
// Process response.
std::cout << response.data() << std::endl;
}
Status status = reader->Finish();
if (status.ok()) {
std::cout << "MyStreamingMethod succeeded." << std::endl;
} else {
std::cout << "MyStreamingMethod failed." << std::endl;
}
}
在这个例子中,MyStreamingMethod
是一个服务器端流式RPC,客户端发送一个MyRequest
请求,然后读取一个流的MyResponse
响应。服务器在接收到请求后,通过ServerWriter
对象向客户端发送多个响应。
客户端向服务端发送请求后的回复,通常是通过返回一个Status
对象来实现的。在上述例子中,MyStreamingMethod
在完成所有响应发送后,返回一个Status::OK
表示成功。客户端通过调用ClientReader::Finish
方法来获取这个状态。
分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za