• gRPC 四模式之 服务器端流RPC模式


    服务器端流RPC模式

    在一元 RPC 模式中,gRPC 服务器端和 gRPC 客户端在通信时始终只有一个请求和一个响应。在服务器端流 RPC 模式中,服务器端在接收到客户端的请求消息后,会发回一个响应的序列。这种多个响应所组成的序列也被称为“流”。在将所有的服务器端响应发送完毕之后,服务器端会以 trailer 元数据的形式将其状态发送给客户端,从而标记流的结束。
    在这里插入图片描述

    c++ 实现服务器端主动推送消息

    在gRPC中,服务端主动向客户端发送数据通常是通过服务器端流式RPC实现的。在这种模式下,客户端发送一个请求到服务器,获取一个读取服务端流的响应。这种模式可以让服务器主动推送消息给客户端。

    以下是一个C++的例子,展示了一个简单的服务器端流式RPC的实现:

    // .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;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在这个例子中,MyStreamingMethod是一个服务器端流式RPC,客户端发送一个MyRequest请求,然后读取一个流的MyResponse响应。服务器在接收到请求后,通过ServerWriter对象向客户端发送多个响应。

    客户端向服务端发送请求后的回复,通常是通过返回一个Status对象来实现的。在上述例子中,MyStreamingMethod在完成所有响应发送后,返回一个Status::OK表示成功。客户端通过调用ClientReader::Finish方法来获取这个状态。


    分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

  • 相关阅读:
    Three.js 中的场景与相机基础
    C++ - C++11历史 - 统一列表初始化 - aotu - decltype - nullptr - C++11 之后 STL 的改变
    YOLOv5 烟叶病害检测系统优化教程
    惯导标定国内外研究现状小结(删减版)
    Spring--BeanUtils工具类--使用/实例
    【MySQL】MySQL表之联合查询(多表查询)
    laravel vue tailwind normalize
    Linux的redis启动过程详解
    MySQL基础篇【子查询】
    linux系统编程3—文件存储函数
  • 原文地址:https://blog.csdn.net/qq_29111047/article/details/134485538