gRPC 四模式之 双向流RPC模式

简介: gRPC 四模式之 双向流RPC模式

双向流RPC模式

在双向流 RPC 模式中,客户端以消息流的形式发送请求到服务器端,服务器端也以消息流的形式进行响应。调用必须由客户端发起,但在此之后,通信完全基于 gRPC 客户端和服务器端的应用程序逻辑。

为什么有了双向流模式,还要使用单向流模式?

然双向流模式非常强大,但并不是所有的场景都需要这种模式。客户端流、服务端流和双向流这三种模式各有其适用的场景。

  1. 客户端流模式:在这种模式下,客户端可以连续发送多个消息到服务器,但服务器只返回一个响应。这种模式适用于客户端需要上传大量数据,但服务器只需要返回一个结果的场景,例如文件上传。
  2. 服务端流模式:在这种模式下,客户端发送一个请求到服务器,然后服务器可以连续返回多个响应。这种模式适用于服务器需要返回大量数据,但客户端只发送一个请求的场景,例如数据下载。
  3. 双向流模式:在这种模式下,客户端和服务器都可以连续发送和接收消息。这种模式适用于需要实时交互的场景,例如聊天应用。

选择哪种模式取决于你的具体需求。如果你的应用只需要一方连续发送消息,那么客户端流或服务端流可能更适合。如果你的应用需要双方都可以连续发送和接收消息,那么双向流可能更适合。


c++ 的双向流模式的一个实现

在gRPC中,双向流模式的C++实现涉及到创建一个服务,该服务在.proto文件中定义,然后在服务器端和客户端实现。以下是一个简单的示例:

首先,我们在.proto文件中定义服务:

syntax = "proto3";

service MyService {
  rpc MyMethod (stream MyRequest) returns (stream MyResponse) {}
}

message MyRequest {
  // Your request fields here
}

message MyResponse {
  // Your response fields here
}

然后,我们在服务器端实现这个服务:

class MyServiceImpl final : public MyService::Service {
  grpc::Status MyMethod(grpc::ServerContext* context, grpc::ServerReaderWriter<MyResponse, MyRequest>* stream) override {
    MyRequest request;
    while (stream->Read(&request)) {
      // Process the request and generate a response
      MyResponse response;
      // Fill the response
      stream->Write(response);
    }
    return grpc::Status::OK;
  }
};

最后,我们在客户端使用这个服务:

class MyClient {
 public:
  explicit MyClient(std::shared_ptr<grpc::Channel> channel)
      : stub_(MyService::NewStub(channel)) {}

  void MyMethod() {
    grpc::ClientContext context;
    auto stream = stub_->MyMethod(&context);
    // Send requests
    for (int i = 0; i < 10; ++i) {
      MyRequest request;
      // Fill the request
      stream->Write(request);
    }
    stream->WritesDone();
    // Receive responses
    MyResponse response;
    while (stream->Read(&response)) {
      // Process the response
    }
    grpc::Status status = stream->Finish();
    if (!status.ok()) {
      // Handle the error
    }
  }

 private:
  std::unique_ptr<MyService::Stub> stub_;
};

代码分析

这是一个使用gRPC编写的C++客户端程序。程序中定义了一个名为MyClient的类,该类包含一个构造函数和一个名为MyMethod的成员函数。

构造函数接受一个std::shared_ptr类型的参数,用于连接gRPC服务器。通过该参数,MyClient类可以创建一个MyService::Stub类型的对象,该对象用于调用gRPC服务器的MyMethod方法。


MyMethod函数用于调用gRPC服务器的MyMethod方法。首先,它创建一个grpc::ClientContext类型的对象context,然后使用stub_对象调用MyMethod方法,并将context作为参数传递。接下来,它创建一个MyRequest类型的对象request,并使用stream对象将其写入。然后,它使用循环向stream对象发送10个MyRequest类型的对象,直到完成。


接着,它使用stream对象读取响应,并将它们存储在MyResponse类型的对象response中。然后,它使用一个无限循环来处理这些响应,直到stream对象完成。最后,它使用stream对象获取完成状态,并检查是否发生错误。如果发生错误,它将调用grpc::Status::Status方法来获取错误信息,并调用grpc::Status::Status方法来处理错误。


总结起来,这是一个使用gRPC编写的C++客户端程序,用于调用gRPC服务器上的MyMethod方法,并将响应处理为MyResponse类型。


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



目录
相关文章
|
9天前
|
安全 C++
gRPC 四模式之 客户端流RPC模式
gRPC 四模式之 客户端流RPC模式
12 0
|
9天前
|
C++
gRPC 四模式之 服务器端流RPC模式
gRPC 四模式之 服务器端流RPC模式
16 0
|
9天前
|
JSON API 数据格式
gRPC 四模式之 一元RPC模式
gRPC 四模式之 一元RPC模式
9 0
|
2月前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
138 9
|
2月前
|
设计模式 负载均衡 网络协议
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
88 0
|
10月前
|
消息中间件 负载均衡 Dubbo
如何自己设计一个类似Dubbo的RPC框架?
如何自己设计一个类似Dubbo的RPC框架?
72 0
|
2月前
|
Dubbo Java 应用服务中间件
Rpc编程系列文章第三篇:Hessian RPC一个老的RPC框架
Rpc编程系列文章第三篇:Hessian RPC一个老的RPC框架
|
4天前
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
|
9天前
|
分布式计算 资源调度 网络协议
分布式系统详解--框架(Hadoop--RPC协议)
分布式系统详解--框架(Hadoop--RPC协议)
13 0
|
2月前
|
Dubbo 网络协议 Java
性能基础之常见RPC框架浅析
【4月更文挑战第23天】性能基础之常见RPC框架浅析
62 1
性能基础之常见RPC框架浅析