golang使用protobuf
1 Protobuf簡介Google Protocol Buffer( 簡稱 Protobuf)是Google公司內(nèi)部的混合語言數(shù)據(jù)標(biāo)準(zhǔn),他們主要用于RPC系統(tǒng)和持續(xù)數(shù)據(jù)存儲系統(tǒng)。...
1 Protobuf簡介
Google Protocol Buffer( 簡稱 Protobuf)是Google公司內(nèi)部的混合語言數(shù)據(jù)標(biāo)準(zhǔn),他們主要用于RPC系統(tǒng)和持續(xù)數(shù)據(jù)存儲系統(tǒng)。
2 Protobuf 應(yīng)用場景
Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化。它很適合做數(shù)據(jù)存儲或RPC數(shù)據(jù)交換格式??捎糜谕ㄓ崊f(xié)議、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)、平臺無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。
簡單來說,Protobuf的功能類似于XML,即負(fù)責(zé)把某種數(shù)據(jù)結(jié)構(gòu)的信息,以某種格式保存起來。主要用于數(shù)據(jù)存儲、傳輸協(xié)議等使用場景。
3 Protobuf 優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 性能好/效率高時(shí)間維度:XML,JSON格式對數(shù)據(jù)進(jìn)行序列化和反序列化時(shí)性能差??臻g維度:XML,JSON格式為了可讀性,必然在進(jìn)行存儲數(shù)據(jù)時(shí),也會消耗空間。整體而言,Protobuf以高效的二進(jìn)制方式存儲,比XML小3到10倍,快20到100倍。
- 代碼生成機(jī)制代碼生成機(jī)制能夠極大解放開發(fā)者編寫數(shù)據(jù)協(xié)議解析過程的時(shí)間,提高工作效率;于開發(fā)者維護(hù)和迭代。
- 支持“向后兼容”和“向前兼容”
- 支持多種編程語言Protobuf不僅僅Google開源的一個(gè)數(shù)據(jù)協(xié)議,還有很多種語言的開源項(xiàng)目實(shí)現(xiàn)。
缺點(diǎn)
- 可讀性較差為了提高性能,Protobuf采用了二進(jìn)制格式進(jìn)行編碼。二進(jìn)制格式編碼對于開發(fā)者來說,是沒辦法閱讀的。在進(jìn)行程序調(diào)試時(shí),比較困難。對于可讀性要求高的數(shù)據(jù)報(bào)文程序就不建議使用。
- 缺乏自描述Protobuf是通過二進(jìn)制格式進(jìn)行數(shù)據(jù)傳輸,開發(fā)者面對二進(jìn)制格式的Protobuf,沒有辦法知道所對應(yīng)的真實(shí)的數(shù)據(jù)結(jié)構(gòu),因此在使用Protobuf協(xié)議傳輸時(shí),必須配備對應(yīng)的proto配置文件。
Protobuf3 語法指南:
https://colobu.com/2017/03/16/Protobuf3-language-guide
4 Go語言中的編程實(shí)現(xiàn)
4.1 安裝protobuf編譯器
使用release版本下載地址:
https://github.com/protocolbuffers/protobuf/releases
方式一:
下載對應(yīng)平臺的二進(jìn)制文件,配置環(huán)境變量即可
image.png
方式二
由于我本機(jī)下載二進(jìn)制文件太慢,這里使用編譯安裝
Ubuntu 安裝(如果是centos直接將apt-get改為yum,如果是alpine將apt-get install 改為apk add)
4.2 安裝go插件 protoc-gen-go
- proto:實(shí)現(xiàn)了對編碼,解碼等,在后面會用到。
- 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
此時(shí)會在$GOPATH/bin/生成二進(jìn)制文件
ls $GOPATH/bin/protoc-gen-go/home/jinchunguang/go/bin/protoc-gen-go
5 使用Protobuf的步驟
5.1 編寫proto文件
# 創(chuàng)建項(xiàng)目目錄mkdir -pv protobuf-app/pbcd protobuf-app# 使用go modgo mod init protobuf-app# 編寫協(xié)議文件touch pb/person.protovim pb/person.proto
person.proto文件內(nèi)容
syntax = "proto3";package pb;message Person { string Name = 1; int32 Age = 2; string From = 3;}
5.2 生成協(xié)議文件
protoc --proto_path=./pb --go_out=./pb ./pb/person.proto
此時(shí)就會發(fā)現(xiàn)多了一個(gè)person.pb.go,這個(gè)就是生成的的協(xié)議文件
tree.├── go.mod└── pb ├── person.pb.go └── person.proto1 directory, 3 files
5.3 測試
下載編碼解碼庫,也可以不下載,運(yùn)行時(shí)go mod會自動(dòng)解決依賴.
go get -u -v github.com/golang/protobuf/proto
main.go
執(zhí)行程序
image.png
6 使用protobuf實(shí)現(xiàn)簡單的Tcp通訊
6.1 新建proto文件 message.proto
文件內(nèi)容
syntax = "proto3";package pb;message Message{ string message = 1; int32 length = 2;}
生成協(xié)議文件
protoc --proto_path=./pb --go_out=./pb ./pb/message.proto
6.2 新建立srv目錄,添加 client,server 目錄并且新建對應(yīng)的go程序
client.go
server.go
6.3 測試
啟動(dòng)服務(wù):
go run server.go
推薦閱讀:oppo官網(wǎng)a9