首頁>技術>

1 Protobuf簡介

Google Protocol Buffer( 簡稱 Protobuf)是Google公司內部的混合語言資料標準,他們主要用於RPC系統和持續資料儲存系統。

2 Protobuf 應用場景

Protocol Buffers 是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,或者說序列化。它很適合做資料儲存或RPC資料交換格式。可用於通訊協議、資料儲存等領域的語言無關、平臺無關、可擴充套件的序列化結構資料格式。

簡單來說,Protobuf的功能類似於XML,即負責把某種資料結構的資訊,以某種格式儲存起來。主要用於資料儲存、傳輸協議等使用場景。

3 Protobuf 優缺點優點效能好/效率高時間維度:XML,JSON格式對資料進行序列化和反序列化時效能差。空間維度:XML,JSON格式為了可讀性,必然在進行儲存資料時,也會消耗空間。整體而言,Protobuf以高效的二進位制方式儲存,比XML小3到10倍,快20到100倍。程式碼生成機制程式碼生成機制能夠極大解放開發者編寫資料協議解析過程的時間,提高工作效率;於開發者維護和迭代。支援“向後相容”和“向前相容”支援多種程式語言Protobuf不僅僅Google開源的一個數據協議,還有很多種語言的開源專案實現。缺點可讀性較差為了提高效能,Protobuf採用了二進位制格式進行編碼。二進位制格式編碼對於開發者來說,是沒辦法閱讀的。在進行程式除錯時,比較困難。對於可讀性要求高的資料報文程式就不建議使用。缺乏自描述Protobuf是通過二進位制格式進行資料傳輸,開發者面對二進位制格式的Protobuf,沒有辦法知道所對應的真實的資料結構,因此在使用Protobuf協議傳輸時,必須配備對應的proto配置檔案。

Protobuf3 語法指南:https://colobu.com/2017/03/16/Protobuf3-language-guide

4 Go語言中的程式設計實現4.1 安裝protobuf編譯器

使用release版本下載地址:

https://github.com/protocolbuffers/protobuf/releases

方式一:

下載對應平臺的二進位制檔案,配置環境變數即可

image.png

方式二

由於我本機下載二進位制檔案太慢,這裡使用編譯安裝

Ubuntu 安裝(如果是centos直接將apt-get改為yum,如果是alpine將apt-get install 改為apk add)

4.2 安裝go外掛 protoc-gen-goproto:實現了對編碼,解碼等,在後面會用到。protoc-gen-go: 編譯器外掛:生成Go原始檔。# 下載go get -u -v github.com/golang/protobuf/protoc-gen-go# 安裝cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go/ go install

此時會在$GOPATH/bin/生成二進位制檔案

ls $GOPATH/bin/protoc-gen-go/home/jinchunguang/go/bin/protoc-gen-go5 使用Protobuf的步驟5.1 編寫proto檔案# 建立專案目錄mkdir -pv protobuf-app/pbcd protobuf-app# 使用go modgo mod init protobuf-app# 編寫協議檔案touch pb/person.protovim pb/person.proto

person.proto檔案內容

syntax = "proto3";package pb;message Person { string Name = 1; int32 Age = 2; string From = 3;}5.2 生成協議檔案protoc --proto_path=./pb --go_out=./pb ./pb/person.proto

此時就會發現多了一個person.pb.go,這個就是生成的的協議檔案

tree.├── go.mod└── pb ├── person.pb.go └── person.proto1 directory, 3 files5.3 測試

下載編碼解碼庫,也可以不下載,執行時go mod會自動解決依賴.

go get -u -v github.com/golang/protobuf/proto

main.go

執行程式

image.png

6 使用protobuf實現簡單的Tcp通訊6.1 新建proto檔案 message.proto

檔案內容

syntax = "proto3";package pb;message Message{    string message = 1;    int32 length = 2;}

生成協議檔案

client.go

server.go

6.3 測試

啟動服務:

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Android實戰001:Android SDK下載安裝詳解