怎樣建設(shè)公司網(wǎng)站小程序seo服務(wù)商排名
手寫RPC——數(shù)據(jù)序列化工具protobuf
Protocol Buffers(protobuf)是一種用于結(jié)構(gòu)化數(shù)據(jù)序列化的開源庫和協(xié)議。下面是 protobuf 的一些優(yōu)點和缺點:
優(yōu)點:
高效的序列化和反序列化:protobuf 使用二進制編碼,相比于文本格式(如 JSON 或 XML),具有更高的序列化和反序列化性能。它使用緊湊的二進制格式,節(jié)省了存儲空間和網(wǎng)絡(luò)帶寬。
小巧的消息體積:protobuf的編碼格式非常緊湊,消息體積較小。這對于需要在網(wǎng)絡(luò)上傳輸大量數(shù)據(jù)或存儲大量數(shù)據(jù)的場景非常有利,減少了存儲和傳輸?shù)某杀尽?/p>
跨語言支持:protobuf 支持多種編程語言,包括 C++, Java, Python, Go 等,使得不同語言的應(yīng)用程序能夠相互通信和交換數(shù)據(jù)。protobuf 提供了自動生成的代碼,使得在不同語言之間進行數(shù)據(jù)傳輸更加方便。
可擴展性:protobuf 的消息格式是可擴展的,允許向已有的消息類型添加新的字段或修改現(xiàn)有字段,而不會破壞向后兼容性。這使得在數(shù)據(jù)模型發(fā)生變化時,能夠平滑地升級和演化。
易于維護和更新:由于 protobuf 使用 IDL(接口定義語言)來定義消息格式,使得代碼的維護和更新更加容易。只需更新 IDL 文件,并重新生成代碼,就能夠同步更新所有相關(guān)的代碼。
缺點:
不適合人類可讀:protobuf 使用二進制編碼,不像 JSON 或 XML 那樣易于人類可讀和調(diào)試。這對于調(diào)試和開發(fā)過程中的可視化和人類可讀性要求較高的場景可能不夠友好。
需要預(yù)先定義消息格式:protobuf 要求在使用之前,需要先定義消息格式,并生成對應(yīng)的代碼。這增加了一些額外的步驟和工作量,相比于一些動態(tài)的數(shù)據(jù)格式,如 JSON,可能稍顯繁瑣。
不支持動態(tài)架構(gòu):protobuf 的消息格式在定義后是靜態(tài)的,不支持在運行時動態(tài)地修改和擴展消息。如果需要在運行時根據(jù)需要動態(tài)地修改數(shù)據(jù)結(jié)構(gòu),protobuf可能不是最佳選擇。
總體而言,protobuf 是一種高效、跨語言和可擴展的數(shù)據(jù)序列化和通信協(xié)議,適用于對數(shù)據(jù)大小和性能要求較高的場景。它在分布式系統(tǒng)、網(wǎng)絡(luò)通信和存儲等領(lǐng)域得到廣泛應(yīng)用。然而,根據(jù)具體的使用場景和需求,仍需綜合考慮其優(yōu)點和缺點,選擇合適的數(shù)據(jù)格式和通信協(xié)議。
安裝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;
}
采用下面的指令轉(zhuǎn)換為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() {// 構(gòu)建請求消息AddRequest request;request.set_x(5);request.set_y(3);// 將消息進行序列化成字符串存儲至requestStrstring 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;
}
輸出結(jié)果如下:
可見我的github倉庫:https://github.com/mulinhu/CPPer/tree/main/network_demo/proto_demo