首页 > 编程语言 >C++下的gRPC与protobuf使用和介绍

C++下的gRPC与protobuf使用和介绍

时间:2024-11-29 17:11:06浏览次数:6  
标签:调用 protobuf gRPC C++ grpc RPC 流式 方法 客户端

目录


gRPC允许定义四类服务方法

  1. 一元RPC:客户端发送一次请求,等待服务端响应结构,会话结束,就像一次普通的函数调用这样简单

    一元RPC
  2. 服务端流式RPC:客户端发起一起请求,服务端会返回一个流,客户端会从流中读取一系列消息,直到没有结果为止

    服务端流式RPC
  3. 客户端流式RPC:客户端提供一个数据流并写入消息发给服务端,一旦客户端发送完毕,就等待服务器读取这些消息并返回应答

    客户端流式RPC
  4. 双向流式RPC:客户端和服务端都提供一个数据流,都可以通过各自的流进行读写数据,这两个流是相互独立的,客户端和服务端都可以按其希望的任意顺序独写

    双向流式RPC

原文链接:https://blog.csdn.net/jianfeng123123/article/details/128110603


流是会结束的

并不似长连接,建立上之后就一直保持,有消息的时候发送。(是否有通过建立一个流 RPC 建立推送机制?)

Client 发送流,是通过 Writer->WritesDone() 函数结束流

Server 发送流,是通过结束 RPC 函数并返回状态码的方式来结束流

流接受者,都是通过 Reader->Read() 返回的 bool 型状态,来判断流是否结束

Server 并没有像 Client 一样调用 WriteDone(),而是在消息之后,将 status code、可选的 status message、可选的 trailing metadata 追加进行发送,这就意味着流结束了。


xxx.pb.hxxx.pb.cc: 生成我们编写的proto message数据结构类型的相关的方法,这两个文件是对proto文件中各消息结构的方法的创建和实现,清除,设置,获取等

xxx.grpc.pb.ccxxx.grpc.pb.h:生成proto文件中rpc函数客户端和服务器的相关方法,用于grpc服务器,客户端通讯相关的方法


stream(流式传输)编写流程

grpc的流式传输的有三种类: grpc::ClientReader; grpc::ClientWriter; grpc::ClientReaderWriter;

grpc::ClientReaderWriter类是输入输出都是流的函数类,例如代码中的Stream函数。

他们三个类基本方法都一样

  • ClientReaderWriter类中包含Read Write两个方法,可读可写
  • 而ClientReader类中包含Read方法,只可读
  • ClientWriter类中包含Write方法,只可写。

WritesDone方法(流数据写结束标识):ClientReaderWriter,ClientWriter都包含该方法。

Finish方法(读流数据结束标识):ClientReaderWriter,ClientReader都包含该方法。

三种类中的方法用法一样,grpc::ClientReader; grpc::ClientWriter不再做单独说明,用法和grpc::ClientReaderWriter一样。

使用哪个类就加上对应的命名空间的使用声明

  • 服务器:

    • using grpc::ServerReader;
    • using grpc::ServerWriter;
    • using grpc::ServerReaderWriter;
    • 服务器没有客户端的WritesDone()和 Finish()方法,用法参考代码,Read() Write()方法的使用和客户端是一样的。
  • 客户端:

    • using grpc::ClientReader;
    • using grpc::ClientWriter;
    • using grpc::ClientReaderWriter;

在gRPC中,流式传输(Streaming)是一种允许在单个RPC调用中发送多个消息序列的功能。这对于需要处理大量数据或需要实时交互的应用非常有用。以下是一个简化的流程,说明如何在gRPC中使用ClientReader, ClientWriter, 和 ClientReaderWriter 类进行流式传输的编写。


客户端使用 ClientReader

  1. 创建Stub:首先,你需要有一个gRPC服务的stub实例。

  2. 调用流式方法:通过stub调用服务定义中声明的流式方法,这将返回一个ClientReader对象。

  3. 读取数据:在循环中调用ClientReaderRead方法,该方法将尝试从服务器读取下一个消息。如果返回true,则消息已填充到传入的参数中;如果返回false,则表示没有更多消息可读(可能是因为流已关闭或发生错误)。

  4. 处理读取到的数据:在循环内部,处理从服务器接收到的每个消息。

  5. 完成读取:一旦Read方法返回false,通常意味着流已结束。此时,可以调用Finish方法来获取RPC调用的最终状态(成功或失败)。


客户端使用 ClientWriter

  1. 创建Stub:同样,首先需要gRPC服务的stub实例。

  2. 调用流式方法:通过stub调用服务定义中声明的流式方法,这将返回一个ClientWriter对象。

  3. 写入数据:在循环中调用ClientWriterWrite方法,将消息发送到服务器。继续发送消息直到所有数据都已发送。

  4. 标记写入完成:使用WritesDone方法标记所有消息都已发送完毕。这允许服务器知道不会再有更多的消息被发送,并开始处理已接收的消息。

  5. 完成写入:调用Finish方法等待服务器处理完所有消息并返回RPC调用的最终状态。


客户端使用 ClientReaderWriter

  1. 创建Stub:与前两者相同,首先需要gRPC服务的stub实例。

  2. 调用流式方法:通过stub调用服务定义中声明的双向流式方法,这将返回一个ClientReaderWriter对象。

  3. 读写数据:在需要时,可以在循环中交替调用Write方法和Read方法。发送消息到服务器并读取来自服务器的响应。

  4. 标记写入完成:当所有消息都已发送时,使用WritesDone方法标记写入完成。

  5. 完成读写:继续读取服务器的响应直到Read方法返回false,然后调用Finish方法等待RPC调用的最终状态。


服务器端

服务器端处理流式RPC的方式与客户端略有不同,但基本概念相同。服务器端使用ServerReader, ServerWriter, 或 ServerReaderWriter 来接收或发送消息。服务器端的实现需要处理这些流对象提供的读写操作,并在适当的时候返回RPC调用的结果。

请注意,实际实现细节(如错误处理、流控制等)可能会根据具体的应用场景和需求而有所不同。

标签:调用,protobuf,gRPC,C++,grpc,RPC,流式,方法,客户端
From: https://www.cnblogs.com/yubo-guan/p/18577148

相关文章

  • C++11-lambda表达式
    目录 1.labmda的表达式1.1.仿函数的使用  1.2lambda表达式的书写 1.3lambda的捕获列表1.3.1传值捕捉1.3.2mutable可以修改拷贝对象  1.3.3 引用捕获 1.3.4混合捕捉  1.4函数对象与lambda表达式 1.5  lambda和仿函数的比较......
  • 今天你学C++了吗——C++中的类与对象(第三集)
    ♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥♥♥♥我们一起努力成为更好的自己~♥♥♥♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥✨✨✨✨✨✨......
  • c++判断字符串全是字母或数字
    使用std::all_of判断字符串是否全为字母、数字或字母数字#include<iostream>#include<string>#include<algorithm>#include<cctype>//用于isdigit,isalpha等函数//std::islower(ch);//判断字符是否是小写字母//std::isupper(ch);//判断字符是否是大写字母......
  • 10C++选择结构(4)——教学
    一、switch语句(第25课成绩等级)问题:风之巅小学规定,若测试成绩大于或等于90分为“A”,大于或等于70分小于90分为“B”,大于或等于60分小于70分为“C”,60分以下为“D”。试编一程序,输入一个成绩,输出它的等级。流程图如下:用if语句处理多个分支时需使用if-else-if结构,分支越多,嵌套......
  • C++练级计划->《右值引用和移动语义》
    目录什么是左值右值?什么是左值?什么是右值?左值引用和右值引用左值引用右值引用右值引用使用场景和意义使用场景:左值引用的短板右值引用和移动语义:移动构造:右值引用的使用场景+1:完美转发万能引用什么是左值右值?什么是左值?左值是一个有具体地址的值。左值可......
  • C++关于二叉树的具体实现
    目录1.二叉树的结构2.创建一棵二叉树3.二叉树的先序遍历1.借助栈的先序遍历2.利用递归的先序遍历4.二叉树的中序遍历5.二叉树的后序遍历1.借助栈的后序遍历2.利用递归的后序遍历6.二叉树的层序遍历7.tree.h8.tree.cpp9.main.cpp1.二叉树的结构对于二叉树来说......
  • C++:多态的原理
    目录一、多态的原理1.虚函数表 2.多态的原理  二、单继承和多继承的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表  一、多态的原理1.虚函数表 首先我们创建一个使用了多态的类,创建一个对象来看其内部的内容:#include<iostream>usingnamespacestd;......
  • C++二级抽测题目(答案+题目)
    今天我给大家出一套C++二级考题限时2.5小时,大家加油!!!题目1:温度转换说明编一程序,将摄氏温度换为华氏温度。公式为:f=9/5*c+32。其中f为华氏温度,c是摄氏温度。(5.2.12)输入格式输入一行,只有一个整数c输出格式输出只有一行,包括1个实数。(保留两位小数)样例输入数据15......
  • C++类和对象(下)
    构造函数之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。每个成员变量在初始化列表中......
  • C++读写word文档(.docx)-DuckX库的使用
    DuckX是一个用于创建和编辑MicrosoftWord(.docx)文件的C++库。本文将简单介绍其用法,库的编译可见https://blog.csdn.net/hfy1237/article/details/144129745一、基本用法1.读取文档#include<iostream>#include"duckx.hpp"intmain(){ duckx::Document......