深入理解Golang中的Protocol Buffers及其應(yīng)用
初識(shí)Protobuf
Protocol Buffers簡(jiǎn)稱protobuf,是一個(gè)無關(guān)語言,無關(guān)平臺(tái)的用于序列化結(jié)構(gòu)化數(shù)據(jù)的工具,于2008年被Google開源的一種數(shù)據(jù)描述語言,也可以叫做接口規(guī)范的描述語言,相較于json體積更小,傳輸更快,常定義在.proto文件中,在特定語言進(jìn)行編譯時(shí)進(jìn)行動(dòng)態(tài)編譯,所以即使你客戶與服務(wù)端使用不同的語言,只要修改proto文件則會(huì)在兩端同時(shí)生效:
protobuf優(yōu)勢(shì):使用二進(jìn)制格式進(jìn)行數(shù)據(jù)編碼,相比于文本格式(如 JSON 或 XML),它能顯著減少數(shù)據(jù)的體積,這使得在網(wǎng)絡(luò)傳輸中數(shù)據(jù)更加緊湊,帶寬占用更少,尤其在處理大規(guī)模數(shù)據(jù)時(shí),能夠提升性能,當(dāng)然還有編解碼效率和多語言支持等等的優(yōu)勢(shì):
Protobuf原理介紹
protobuf是一種二進(jìn)制格式編碼,實(shí)現(xiàn)序列化的結(jié)構(gòu)化數(shù)據(jù)信息需要通過message來定義一個(gè)類似struct的數(shù)據(jù)集合,每一條protocol buffer消息都是一個(gè)小的邏輯記錄,包含了一系列的name-value鍵值對(duì),文件都是以 .proto 為后綴 ,如下是一個(gè)基礎(chǔ)的.proto文件示例:
message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; }
每一條消息類型都有一個(gè)或多個(gè)編號(hào)唯一的field,并且每一個(gè)field都具有名稱和類型,以如下簡(jiǎn)單的messgae進(jìn)行舉例說明一下每個(gè)字段的含義是什么:
// repeated: 字段tag,表示復(fù)合類型 // Result: 字段數(shù)據(jù)類型,可以自定義 // results: 字段的命名 // 1: 字段的編號(hào) message SearchResponse { repeated Result results = 1; }
Go語言環(huán)境搭建
protoc:是一個(gè)protobuf編譯器用于將protobuf)描述文件.proto 文件轉(zhuǎn)換成各編程語言源代碼的工具,這個(gè)編譯器根據(jù) .proto 文件中定義的數(shù)據(jù)結(jié)構(gòu),自動(dòng)生成序列化和反序列化的代碼,便于開發(fā)者在不同的編程語言中使用protobuf進(jìn)行數(shù)據(jù)交換,如下圖所示
通過protobuf編輯器的作用,我們就可以將.proto 文件構(gòu)造生成右側(cè)的go語言的package:
接下來我們開始下載protoc這個(gè)編輯器,來到官方網(wǎng)址:地址,這里注意根據(jù)自身電腦系統(tǒng)情況下載不同的源碼包,這里我就以window系統(tǒng)進(jìn)行舉例,這里我們安裝如下最新版本:
下載之后將壓縮包解壓到本地非C盤目錄下,解壓后的文件內(nèi)包含如下三個(gè)文件:
include:頭文件或庫文件;bin:包含protoc編譯器;readme.txt安裝教程
了解即可:接下來把解壓后?件中的bin目錄配置到系統(tǒng)環(huán)境變量的Path中去:
然后win+r打開cmd終端輸入protoc--version命令出現(xiàn)如下界面,有版本號(hào)說明我們安裝配置成功:
主要操作:接下來我們只需要將該解壓文件bin目錄下的 protoc.exe 文件放置到我們配置go語言的GOBIN目錄下即可,如下可以看到我們的默認(rèn)GOBIN目錄:
接下來還需要安裝兩個(gè)go語言的插件工具:protoc-gen-go和protoc-gen-go-grpc它們用于生成 go語言代碼,分別用于處理protobuf消息和實(shí)現(xiàn)grpc服務(wù),這里我們只需要cmd執(zhí)行如下安裝命令即可:
// 如果下載失敗(網(wǎng)絡(luò)延遲斷開),可以考慮先開啟代理,在執(zhí)行如下兩個(gè)插件安裝 go env -w GOPROXY=https://goproxy.cn,direct // 安裝protoc-gen-go go install google.golang.org/protobuf/cmd/protoc-gen-go@latest // 安裝 grpc go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
網(wǎng)速不好直接開啟代理,出現(xiàn)如下界面說明我們安裝成功:
然后我們來到我們的GOBIN目錄下可以看到我們的工具都以及安裝完成了:
終端執(zhí)行如下命令可以看到我們的安裝版本:
Protobuf基本使用
定義protobuf文件:一般我們定義應(yīng)該protobuf文件采用的寫法如下所示,以下是對(duì)參數(shù)講解:
1)syntax:表示采用proto3的語法,零值初始化
2)package:指明當(dāng)前是main包
3)option:protobuf的一些選項(xiàng)參數(shù),這里指定要生成的go語言package路徑
4)message:關(guān)鍵字定義一個(gè)新的String類型
syntax = "proto3"; package helloworld; option go_package = "./"; // 定義請(qǐng)求消息 message HelloRequest { string name = 1; }
然后我們終端執(zhí)行如下命令,可以看到我們的protobuf被編譯成功了:
編譯protobuf文件:根據(jù)上圖對(duì)protobuf文件進(jìn)行編譯我們知道,還需要輸入對(duì)應(yīng)指令,這里進(jìn)行如下解釋,比如我們要編譯如下文件:
到此這篇關(guān)于深入理解Golang中的Protocol Buffers及其應(yīng)用的文章就介紹到這了,更多相關(guān)Go Protocol內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出的實(shí)現(xiàn)
最近接手一個(gè)商城運(yùn)單號(hào)模塊,接手后發(fā)現(xiàn)有部分運(yùn)單號(hào)返回給前端是按照科學(xué)計(jì)數(shù)法的方式返回,本文就介紹一下Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出,感興趣的可以了解一下2021-07-07深入解析Go語言的io.ioutil標(biāo)準(zhǔn)庫使用
這篇文章主要介紹了Go語言的io.ioutil標(biāo)準(zhǔn)庫使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10go代碼實(shí)現(xiàn)買房貸款月供計(jì)算的方法
今天小編就為大家分享一篇關(guān)于go代碼實(shí)現(xiàn)買房貸款月供計(jì)算的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04Go語言開發(fā)必知的一個(gè)內(nèi)存模型細(xì)節(jié)
這篇文章主要為大家介紹了Go語言開發(fā)必知的一個(gè)內(nèi)存模型細(xì)節(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07