松原網主頁 > 資訊 > 正文 >

golang使用protobuf!

2020-11-20 04:18:19 來源:互聯網 閱讀:-
【摘要】1 Protobuf簡介Google Protocol Buffer( 簡稱 Protobuf)是Google公司內部的混合語言數據標準,他們主要用于RPC系統和持續數據存儲系統。


golang使用protobuf


1 Protobuf簡介

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

2 Protobuf 應用場景

Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用于結構化數據串行化,或者說序列化。它很適合做數據存儲或RPC數據交換格式??捎糜谕ㄓ崊f議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。

簡單來說,Protobuf的功能類似于XML,即負責把某種數據結構的信息,以某種格式保存起來。主要用于數據存儲、傳輸協議等使用場景。

3 Protobuf 優缺點

優點

  • 性能好/效率高時間維度:XML,JSON格式對數據進行序列化和反序列化時性能差??臻g維度: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

方式一:

下載對應平臺的二進制文件,配置環境變量即可

golang使用protobuf

image.png

方式二

由于我本機下載二進制文件太慢,這里使用編譯安裝

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

4.2 安裝go插件 protoc-gen-go

  • proto:實現了對編碼,解碼等,在后面會用到。
  • 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-go

5 使用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 files

5.3 測試


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

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

main.go


golang使用protobuf


golang使用protobuf


執行程序


golang使用protobuf

image.png

6 使用protobuf實現簡單的Tcp通訊

6.1 新建proto文件 message.proto

文件內容

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

生成協議文件

protoc --proto_path=./pb --go_out=./pb ./pb/message.proto

6.2 新建立srv目錄,添加 client,server 目錄并且新建對應的go程序

golang使用protobuf


client.go


golang使用protobuf


golang使用protobuf


server.go


golang使用protobuf


golang使用protobuf


6.3 測試

啟動服務:

go run server.go
golang使用protobuf


golang使用protobuf

推薦閱讀:深圳網

手机麻将作弊管用吗 (*^▽^*)MG好运经纪人_电子游艺 江苏快3走势图360 (*^▽^*)MG篮球巨星免费试玩 (^ω^)MG沙漠宝藏2_官方版 pt电子黄金武士 江西快三走势 131期六肖中特 (★^O^★)MG黑豹之月_正规平台 体彩福建22选5开奖结果查询结果 江西快三开奖信息 006期特码 (★^O^★)MG武则天登陆 (*^▽^*)MG海豚礁免费下载 单双中特公式规律怎么算排卵期 (*^▽^*)MG冰球突破巨额大奖视频 神州彩票网