因?yàn)轫?xiàng)目需要所以學(xué)習(xí)了gPRC
遠(yuǎn)程過(guò)程調(diào)用框架,而這個(gè)框架中就是采用Protocol Buffers
進(jìn)行序列化結(jié)構(gòu)化數(shù)據(jù)的蓝撇,這種序列化數(shù)據(jù)格式與傳統(tǒng)的XML崇决、JSON等格式來(lái)說(shuō)牺六,性能以及占用空間方面更小等優(yōu)點(diǎn)架专,看到這里是不是有種迫不及待想深入了解下Protocol Buffers
呢汉操?
什么是Protocol Buffers?
引用官方的說(shuō)法
a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more.
Protocol Buffers
是一種與語(yǔ)言澈驼、平臺(tái)無(wú)關(guān)建邓,可拓展序列化數(shù)據(jù)的方式,用于通訊協(xié)議春缕,數(shù)據(jù)存儲(chǔ)等盗胀。
Protocol Buffers
是一種靈活、高效锄贼、自動(dòng)化的機(jī)制票灰,用于序列化結(jié)構(gòu)化數(shù)據(jù)。可以定義數(shù)據(jù)的結(jié)構(gòu)屑迂,然后使用獨(dú)有的編譯器輕松將結(jié)構(gòu)化數(shù)據(jù)寫(xiě)入和讀取到各種數(shù)據(jù)流中浸策,而且支持多種語(yǔ)言,甚至可以在不會(huì)破壞“舊”數(shù)據(jù)格式的情況下更新數(shù)據(jù)惹盼。
Protocol Buffers是怎么運(yùn)行的庸汗?
可以通過(guò).proto
后綴文件中定義Protocol Buffers
消息類(lèi)型來(lái)指定希望如何構(gòu)建序列化信息。每個(gè)Protocol Buffers
消息都是一個(gè)小的邏輯信息記錄逻锐,包含了key-value鍵值對(duì)夫晌。如下.proto
是定義人員信息的一個(gè)基本的示例:
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;
}
正如我們所看到的,定義的格式很簡(jiǎn)單昧诱,每種消息類(lèi)型都有一個(gè)或多個(gè)唯一編號(hào)的字段,每個(gè)字段都有一個(gè)名稱和一個(gè)值類(lèi)型所袁,其中值類(lèi)型可以是數(shù)字(整數(shù)或浮點(diǎn)數(shù))盏档,布爾值,字符串燥爷,byte蜈亩,甚至可以是其他Protocol Buffers
定義的消息類(lèi)型,允許分層次的構(gòu)建數(shù)據(jù)前翎。在數(shù)據(jù)類(lèi)型定義中可以指定字段的類(lèi)型optional(可選)稚配、required(必填)、repeated(重復(fù)港华,即集合) 道川,詳細(xì)可以在《Protocol Buffer語(yǔ)法指南》中查看。
一旦定義了數(shù)據(jù)結(jié)構(gòu)立宜,可以將proto
文件運(yùn)行在Protocol Buffers
編譯器生成對(duì)應(yīng)開(kāi)發(fā)語(yǔ)言的數(shù)據(jù)訪問(wèn)類(lèi)冒萄。經(jīng)過(guò)編譯器編譯生成的相應(yīng)開(kāi)發(fā)平臺(tái)語(yǔ)言的訪問(wèn)類(lèi),包含了簡(jiǎn)單的訪問(wèn)入口橙数,以及提供將整個(gè)數(shù)據(jù)結(jié)構(gòu)序列化/反序列化為原始字節(jié)的方法尊流。
關(guān)于Protocol Buffers
如何編譯成相關(guān)開(kāi)發(fā)平臺(tái)的具體可以參考官方文檔,這里提供了《Protocol Buffers基于Windows平臺(tái)構(gòu)建Java版本實(shí)現(xiàn)》
為什么不使用XML灯帮?
寫(xiě)到這里崖技,可能會(huì)有小伙伴疑惑為什么不直接使用傳統(tǒng)的XML、JSON數(shù)據(jù)格式钟哥,非得弄得這么麻煩的迎献。
針對(duì)于傳統(tǒng)序列結(jié)構(gòu)化數(shù)據(jù),Protocol Buffers
比XML瞪醋、JSON具有更多的優(yōu)點(diǎn)忿晕。
- 更簡(jiǎn)單
- 比其小3到10倍
- 運(yùn)行速度上快20到100倍
- 耦合性低
- 可以生成更便于編譯平臺(tái)方式的數(shù)據(jù)訪問(wèn)類(lèi)
例如,用上面定義好的Person舉例银受,定義一個(gè)包含name和email的person對(duì)象践盼,在XML中鸦采,需要:
<person>
<name> John Doe </ name>
<email> jdoe@example.com </ email>
</ person>
而相應(yīng)的protocol buffer
消息(protocol buffer文本格式)是:
# Textual representation of a protocol buffer.
# This is *not* the binary format used on the wire.
person {
name: "John Doe"
email: "jdoe@example.com"
}
此對(duì)象被編碼為protocol buffer
二進(jìn)制格式(上面文本格式只是便于開(kāi)發(fā)者讀寫(xiě)編輯調(diào)試使用)時(shí),它大概只有28字節(jié)咕幻,并且需要大約100-200納秒來(lái)解析渔伯。而xml,即使刪除空格肄程,xml版本至少也得69字節(jié)锣吼,并且需要大約5000-10000納秒才能解析成功。
此外蓝厌,在操作對(duì)象方面來(lái)說(shuō)protocol buffer
也要容易得多玄叠。
但,protocol buffer
相對(duì)比xml也不都是最好的處理數(shù)據(jù)的解決方案拓提,protocol buffer
不是標(biāo)記語(yǔ)言(HTML等)读恃,對(duì)于文本文檔建立結(jié)構(gòu)與文本交錯(cuò)的建模。此外代态,XML是便于讀寫(xiě)編輯的寺惫,但protocol buffer
(原生格式)不是。XML可以進(jìn)行自我描述蹦疑,但protocol buffer
只有在擁有消息定義(.proto
文件)時(shí)西雀,protocol buffer
才有意義。