手写RPC——数据序列化工具protobuf
Protocol Buffers(protobuf)是一种用于结构化数据序列化的开源库和协议。下面是 protobuf 的一些优点和缺点:
优点:
高效的序列化和反序列化:protobuf 使用二进制编码,相比于文本格式(如 JSON 或 XML),具有更高的序列化和反序列化性能。它使用紧凑的二进制格式,节省了存储空间和网络带宽。
小巧的消息体积:protobuf的编码格式非常紧凑,消息体积较小。这对于需要在网络上传输大量数据或存储大量数据的场景非常有利,减少了存储和传输的成本。
跨语言支持:protobuf 支持多种编程语言,包括 C++, Java, Python, Go 等,使得不同语言的应用程序能够相互通信和交换数据。protobuf 提供了自动生成的代码,使得在不同语言之间进行数据传输更加方便。
可扩展性:protobuf 的消息格式是可扩展的,允许向已有的消息类型添加新的字段或修改现有字段,而不会破坏向后兼容性。这使得在数据模型发生变化时,能够平滑地升级和演化。
易于维护和更新:由于 protobuf 使用 IDL(接口定义语言)来定义消息格式,使得代码的维护和更新更加容易。只需更新 IDL 文件,并重新生成代码,就能够同步更新所有相关的代码。
缺点:
不适合人类可读:protobuf 使用二进制编码,不像 JSON 或 XML 那样易于人类可读和调试。这对于调试和开发过程中的可视化和人类可读性要求较高的场景可能不够友好。
需要预先定义消息格式:protobuf 要求在使用之前,需要先定义消息格式,并生成对应的代码。这增加了一些额外的步骤和工作量,相比于一些动态的数据格式,如 JSON,可能稍显繁琐。
不支持动态架构:protobuf 的消息格式在定义后是静态的,不支持在运行时动态地修改和扩展消息。如果需要在运行时根据需要动态地修改数据结构,protobuf可能不是最佳选择。
总体而言,protobuf 是一种高效、跨语言和可扩展的数据序列化和通信协议,适用于对数据大小和性能要求较高的场景。它在分布式系统、网络通信和存储等领域得到广泛应用。然而,根据具体的使用场景和需求,仍需综合考虑其优点和缺点,选择合适的数据格式和通信协议。
安装protobuf
这里以ubuntu为例子
sudo apt install libprotobuf-dev
使用
定义一个rpc.proto文件
syntax = "proto3";
package rpc;
message AddRequest {
int32 x = 1;
int32 y = 2;
}
message AddResponse {
int32 result = 1;
}
采用下面的指令转换为C++代码
protoc --cpp_out=. rpc.proto
一个简单的使用例子
#include <iostream>
#include <string>
#include "rpc.pb.h"
using namespace std;
using rpc::AddRequest;
using rpc::AddResponse;
int main() {
// 构建请求消息
AddRequest request;
request.set_x(5);
request.set_y(3);
// 将消息进行序列化成字符串存储至requestStr
string requestStr;
request.SerializeToString(&requestStr);
//对字符串进行解析
AddRequest req;
req.ParseFromString(requestStr);
AddResponse response;
response.set_result(request.x() + request.y());
cout<<"result:"<<response.result()<<endl;
return 0;
}
输出结果如下:
可见我的github仓库:https://github.com/mulinhu/CPPer/tree/main/network_demo/proto_demo