chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入剖析ProtoBuf原理與工程實踐

Linux愛好者 ? 來源:vivo互聯(lián)網(wǎng)技術(shù) ? 作者:Li Guanyun ? 2021-11-16 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ProtoBuf 作為一種跨平臺、語言無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)的方法,已廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換及存儲。隨著互聯(lián)網(wǎng)的發(fā)展,系統(tǒng)的異構(gòu)性會愈發(fā)突出,跨語言的需求會愈加明顯,同時 gRPC 也大有取代Restful之勢,而 ProtoBuf 作為g RPC 跨語言、高性能的法寶,我們技術(shù)人有必要

深入理解 ProtoBuf 原理,為以后的技術(shù)更新和選型打下基礎(chǔ)。

我將過去的學(xué)習(xí)過程以及實踐經(jīng)驗,總結(jié)成系列文章,與大家一起探討學(xué)習(xí),希望大家能有所收獲,當(dāng)然其中有不正確的地方也歡迎大家批評指正。

一、什么是ProtoBuf

ProtoBuf(Protocol Buffers)是一種跨平臺、語言無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)的方法,可用于網(wǎng)絡(luò)數(shù)據(jù)交換及存儲。

在序列化結(jié)構(gòu)化數(shù)據(jù)的機制中,ProtoBuf是靈活、高效、自動化的,相對常見的XML、JSON,描述同樣的信息,ProtoBuf序列化后數(shù)據(jù)量更小、序列化/反序列化速度更快、更簡單。

一旦定義了要處理的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)之后,就可以利用ProtoBuf的代碼生成工具生成相關(guān)的代碼。只需使用 Protobuf 對數(shù)據(jù)結(jié)構(gòu)進行一次描述,即可利用各種不同語言(proto3支持C++, Java, Python, Go, Ruby, Objective-C, C#)或從各種不同流中對你的結(jié)構(gòu)化數(shù)據(jù)輕松讀寫。

二、為什么是 ProtoBuf

大家可能會覺得 Google 發(fā)明 ProtoBuf 是為了解決序列化速度的,其實真實的原因并不是這樣的。

ProtoBuf最先開始是 Google用來解決索引服務(wù)器 request/response 協(xié)議的。沒有ProtoBuf之前,Google 已經(jīng)存在了一種 request/response 格式,用于手動處理 request/response 的編解碼。它也能支持多版本協(xié)議,不過代碼不夠優(yōu)雅:

if(protocolVersion=1){
doSomething();
}elseif(protocolVersion=2){
doOtherThing();
}...

如果是非常明確的格式化協(xié)議,會使新協(xié)議變得非常復(fù)雜。因為開發(fā)人員必須確保請求發(fā)起者與處理請求的實際服務(wù)器之間的所有服務(wù)器都能理解新協(xié)議,然后才能切換開關(guān)以開始使用新協(xié)議。

這也就是每個服務(wù)器開發(fā)人員都遇到過的低版本兼容、新舊協(xié)議兼容相關(guān)的問題。

為了解決這些問題,于是ProtoBuf就誕生了。

ProtoBuf 最初被寄予以下 2 個特點:

  • 更容易引入新的字段,并且不需要檢查數(shù)據(jù)的中間服務(wù)器可以簡單地解析并傳遞數(shù)據(jù),而無需了解所有字段。
  • 數(shù)據(jù)格式更加具有自我描述性,可以用各種語言來處理(C++, Java 等各種語言)。

這個版本的 ProtoBuf 仍需要自己手寫解析的代碼。

不過隨著系統(tǒng)慢慢發(fā)展,演進,ProtoBuf具有了更多的特性:

  • 自動生成的序列化和反序列化代碼避免了手動解析的需要。(官方提供自動生成代碼工具,各個語言平臺的基本都有)。
  • 除了用于數(shù)據(jù)交換之外,ProtoBuf被用作持久化數(shù)據(jù)的便捷自描述格式。

ProtoBuf 現(xiàn)在是 Google 用于數(shù)據(jù)交換和存儲的通用語言。谷歌代碼樹中定義了 48162 種不同的消息類型,包括 12183 個 .proto 文件。它們既用于 RPC 系統(tǒng),也用于在各種存儲系統(tǒng)中持久存儲數(shù)據(jù)。

ProtoBuf 誕生之初是為了解決服務(wù)器端新舊協(xié)議(高低版本)兼容性問題,名字也很體貼,“協(xié)議緩沖區(qū)”。只不過后期慢慢發(fā)展成用于傳輸數(shù)據(jù)。

Protocol Buffers 命名由來:

Why the name "Protocol Buffers"?

The name originates from the early days of the format, before we had the protocol buffer compiler to generate classes for us. At the time, there was a class called ProtocolBuffer which actually acted as a buffer for an individual method. Users would add tag/value pairs to this buffer individually by calling methods like AddValue(tag, value). The raw bytes were stored in a buffer which could then be written out once the message had been constructed.

Since that time, the "buffers" part of the name has lost its meaning, but it is still the name we use. Today, people usually use the term "protocol message" to refer to a message in an abstract sense, "protocol buffer" to refer to a serialized copy of a message, and "protocol message object" to refer to an in-memory object representing the parsed message.

三、如何使用 ProtoBuf

3.1 ProtoBuf 協(xié)議的工作流程

可以看到,對于序列化協(xié)議來說,使用方只需要關(guān)注業(yè)務(wù)對象本身,即 idl 定義,序列化和反序列化的代碼只需要通過工具生成即可。

3.2 ProtoBuf 消息定義

ProtoBuf 的消息是在idl文件(.proto)中描述的。下面是本次樣例中使用到的消息描述符customer.proto:

syntax="proto3";

packagedomain;

optionjava_package="com.protobuf.generated.domain";
optionjava_outer_classname="CustomerProtos";

messageCustomers{
repeatedCustomercustomer=1;
}

messageCustomer{
int32id=1;
stringfirstName=2;
stringlastName=3;

enumEmailType{
PRIVATE=0;
PROFESSIONAL=1;
}

messageEmailAddress{
stringemail=1;
EmailTypetype=2;
}

repeatedEmailAddressemail=5;
}

上面的消息比較簡單,Customers包含多個Customer,Customer包含一個id字段,一個firstName字段,一個lastName字段以及一個email的集合。

除了這些定義外,文件頂部還有三行可幫助代碼生成器:

  1. 首先,syntax = "proto3"用于idl語法版本,目前有兩個版本proto2和proto3,兩個版本語法不兼容,如果不指定,默認(rèn)語法是proto2。由于proto3比proto2支持的語言更多,語法更簡潔,本文使用的是proto3。

  2. 其次有一個package domain;定義。此配置用于嵌套生成的類/對象。

  3. 有一個option java_package定義。生成器還使用此配置來嵌套生成的源。此處的區(qū)別在于這僅適用于Java。在使用Java創(chuàng)建代碼和使用JavaScript創(chuàng)建代碼時,使用了兩種配置來使生成器的行為有所不同。也就是說,Java類是在包com.protobuf.generated.domain下創(chuàng)建的,而JavaScript對象是在包domain下創(chuàng)建的。

ProtoBuf 提供了更多選項和數(shù)據(jù)類型,本文不做詳細(xì)介紹,感興趣可以參考這里[1]

3.3 代碼生成

首先安裝 ProtoBuf 編譯器 protoc,這里[2]有詳細(xì)的安裝教程,安裝完成后,可以使用以下命令生成 Java 源代碼:

protoc--java_out=./src/main/java./src/main/idl/customer.proto

從項目的根路徑執(zhí)行該命令,并添加了兩個參數(shù):java_out,定義./src/main/java/為Java代碼的輸出目錄;而./src/main/idl/customer.proto是.proto文件所在目錄。

生成的代碼非常復(fù)雜,但是幸運的是它的用法卻非常簡單。

CustomerProtos.Customer.EmailAddressemail=CustomerProtos.Customer.EmailAddress.newBuilder()
.setType(CustomerProtos.Customer.EmailType.PROFESSIONAL)
.setEmail("crichardson@email.com").build();

CustomerProtos.Customercustomer=CustomerProtos.Customer.newBuilder()
.setId(1)
.setFirstName("Lee")
.setLastName("Richardson")
.addEmail(email)
.build();
//序列化
byte[]binaryInfo=customer.toByteArray();
System.out.println(bytes_String16(binaryInfo));
System.out.println(customer.toByteArray().length);
//反序列化
CustomerProtos.CustomeranotherCustomer=CustomerProtos.Customer.parseFrom(binaryInfo);
System.out.println(anotherCustomer.toString());

3.4 性能數(shù)據(jù)

我們簡單地以Customers為模型,分別構(gòu)造、選取小對象、普通對象、大對象進行性能對比。

序列化耗時以及序列化后數(shù)據(jù)大小對比

反序列化耗時

c8f14736-44ef-11ec-b939-dac502259ad0.png

更多性能數(shù)據(jù)可以參考官方 Benchmark[3]

四、總結(jié)

上面介紹了 ProtoBuf 是什么、產(chǎn)生的背景、基本用法,我們再總結(jié)下。

優(yōu)點:

1. 效率高

從序列化后的數(shù)據(jù)體積角度,與XML、JSON這類文本協(xié)議相比,ProtoBuf通過T-(L)-V(TAG-LENGTH-VALUE)方式編碼,不需要", {, }, :等分隔符來結(jié)構(gòu)化信息,同時在編碼層面使用varint壓縮,所以描述同樣的信息,ProtoBuf序列化后的體積要小很多,在網(wǎng)絡(luò)中傳輸消耗的網(wǎng)絡(luò)流量更少,進而對于網(wǎng)絡(luò)資源緊張、性能要求非常高的場景,ProtoBuf協(xié)議是不錯的選擇。

//我們簡單做個對比
//要描述如下JSON數(shù)據(jù)
{"id":1,"firstName":"Chris","lastName":"Richardson","email":[{"type":"PROFESSIONAL","email":"crichardson@email.com"}]}
#使用JSON序列化后的數(shù)據(jù)大小為118byte
7b226964223a312c2266697273744e616d65223a224368726973222c226c6173744e616d65223a2252696368617264736f6e222c22656d61696c223a5b7b2274797065223a2250524f46455353494f4e414c222c22656d61696c223a226372696368617264736f6e40656d61696c2e636f6d227d5d7d
#而使用ProtoBuf序列化后的數(shù)據(jù)大小為48byte
0801120543687269731a0a52696368617264736f6e2a190a156372696368617264736f6e40656d61696c2e636f6d1001

從序列化/反序列化速度角度,與XML、JSON相比,ProtoBuf序列化/反序列化的速度更快,比XML要快20-100倍。

2. 支持跨平臺、多語言

ProtoBuf是平臺無關(guān)的,無論是Android與PC,還是C#與Java都可以利用ProtoBuf進行無障礙通訊。

proto3支持C++, Java, Python, Go, Ruby, Objective-C, C#。

3. 擴展性、兼容性好

具有向后兼容的特性,更新數(shù)據(jù)結(jié)構(gòu)以后,老版本依舊可以兼容,這也是ProtoBuf誕生之初被寄予解決的問題。因為編譯器對不識別的新增字段會跳過不處理。

4. 使用簡單

ProtoBuf 提供了一套編譯工具,可以自動生成序列化、反序列化的樣板代碼,這樣開發(fā)者只要關(guān)注業(yè)務(wù)數(shù)據(jù)idl,簡化了編碼解碼工作以及多語言交互的復(fù)雜度。

缺點

可讀性差,缺乏自描述

XML,JSON是自描述的,而ProtoBuf則不是。

ProtoBuf是二進制協(xié)議,編碼后的數(shù)據(jù)可讀性差,如果沒有idl文件,就無法理解二進制數(shù)據(jù)流,對調(diào)試不友好。

不過Charles已經(jīng)支持ProtoBuf協(xié)議,導(dǎo)入數(shù)據(jù)的描述文件即可,詳情可參考Charles Protocol Buffers[4]

此外,由于沒有idl文件無法解析二進制數(shù)據(jù)流,ProtoBuf在一定程度上可以保護數(shù)據(jù),提升核心數(shù)據(jù)被破解的門檻,降低核心數(shù)據(jù)被盜爬的風(fēng)險。

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    34433
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    1020

    瀏覽量

    56708
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    125

    瀏覽量

    7715

原文標(biāo)題:深入理解 ProtoBuf 原理與工程實踐(概述)

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    淺淺問一下,嵌入式端是用protobuf?

    淺淺問一下,嵌入式那邊是不是都在用 protobuf ???聽人說性能好、省流量、序列化快,移植過去代碼量好像也不大,乍一聽真是嵌入式傳輸協(xié)議的“理想型”。但真一上手搞起來,可能就發(fā)現(xiàn)事情沒那么簡單
    的頭像 發(fā)表于 12-17 10:16 ?62次閱讀
    淺淺問一下,嵌入式端是用<b class='flag-5'>protobuf</b>?

    深入剖析TCAN3413/3414:高性能CAN FD收發(fā)器的卓越之選

    深入剖析TCAN3413/3414:高性能CAN FD收發(fā)器的卓越之選 在電子工程領(lǐng)域,CAN FD收發(fā)器作為關(guān)鍵組件,廣泛應(yīng)用于各種工業(yè)和汽車系統(tǒng)中。今天,我們將深入探討TCAN34
    的頭像 發(fā)表于 12-16 09:55 ?168次閱讀

    深入剖析TPS26750:USB Type - C與PD控制器的卓越之選

    )控制器,在USB - C PD電源應(yīng)用領(lǐng)域展現(xiàn)出了卓越的性能。本文將深入剖析TPS26750的特性、應(yīng)用及設(shè)計要點,為電子工程
    的頭像 發(fā)表于 12-15 17:05 ?252次閱讀

    深入剖析DLP800RE 0.8英寸WUXGA數(shù)字微鏡器件:從特性到應(yīng)用的全面解讀

    揮著至關(guān)重要的作用。TI 推出的 DLP800RE 0.8 英寸 WUXGA 數(shù)字微鏡器件,憑借其卓越的性能和廣泛的應(yīng)用前景,成為了眾多工程師關(guān)注的焦點。本文將深入剖析 DLP800RE 的特性、應(yīng)用以及設(shè)計要點,為電子
    的頭像 發(fā)表于 12-11 10:00 ?176次閱讀

    深入剖析ADC12081:高性能12位A/D轉(zhuǎn)換器的技術(shù)解析

    深入剖析ADC12081:高性能12位A/D轉(zhuǎn)換器的技術(shù)解析 在電子工程領(lǐng)域,模擬 - 數(shù)字轉(zhuǎn)換器(ADC)是連接現(xiàn)實世界模擬信號與數(shù)字系統(tǒng)的關(guān)鍵橋梁。TI公司的ADC12081作為一款12位
    的頭像 發(fā)表于 12-10 09:25 ?368次閱讀

    深入剖析NCP13994:高性能半橋諧振轉(zhuǎn)換器控制器

    在電子工程師的設(shè)計世界里,一款優(yōu)秀的控制器就像是一位得力助手,能夠為電源轉(zhuǎn)換設(shè)計帶來諸多便利和高性能表現(xiàn)。今天,我們就來深入剖析安森美(onsemi)的NCP13994,一款專為半橋諧振轉(zhuǎn)換器打造的高性能電流模式控制器。
    的頭像 發(fā)表于 12-05 11:27 ?346次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>NCP13994:高性能半橋諧振轉(zhuǎn)換器控制器

    深入剖析 onsemi NL7SZ19:1 到 2 解碼器/多路分配器的卓越性能與應(yīng)用

    深入剖析 onsemi NL7SZ19:1 到 2 解碼器/多路分配器的卓越性能與應(yīng)用
    的頭像 發(fā)表于 12-01 13:54 ?195次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b> onsemi NL7SZ19:1 到 2 解碼器/多路分配器的卓越性能與應(yīng)用

    深入剖析ADS5546:高性能14位ADC的卓越之選

    師的首選。今天,我們就來深入剖析這款A(yù)DC,了解它的技術(shù)細(xì)節(jié)和應(yīng)用要點。 文件下載: ads5546.pdf 核心特性,鑄就卓越性能 高采樣率與高精度 ADS5546具備高達(dá)190 MSPS的最大采樣率,能夠快速準(zhǔn)確地采集信號。同時,它擁有14位的分辨率,且無丟失碼,確保
    的頭像 發(fā)表于 11-29 10:41 ?811次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>ADS5546:高性能14位ADC的卓越之選

    深入剖析Z80C30/Z85C30 CMOS SCC串行通信控制器

    (Serial Communications Controller)串行通信控制器,憑借其卓越的性能和豐富的功能,成為了眾多工程師的首選。今天,我們就來深入剖析這款控制器,了解它的特點、功能以及在實際應(yīng)用中
    的頭像 發(fā)表于 11-26 16:22 ?621次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>Z80C30/Z85C30 CMOS SCC串行通信控制器

    CI/CD實踐中的運維優(yōu)化技巧

    在數(shù)字化轉(zhuǎn)型的浪潮中,CI/CD已經(jīng)成為現(xiàn)代軟件開發(fā)的基石。然而,真正能夠發(fā)揮CI/CD威力的,往往在于那些不為人知的運維優(yōu)化細(xì)節(jié)。本文將深入剖析CI/CD實踐中的關(guān)鍵優(yōu)化技巧,幫助您構(gòu)建更高效、更穩(wěn)定的持續(xù)集成與部署體系。
    的頭像 發(fā)表于 09-18 15:05 ?668次閱讀

    深入剖析RabbitMQ高可用架構(gòu)設(shè)計

    在微服務(wù)架構(gòu)中,消息隊列故障導(dǎo)致的系統(tǒng)不可用率高達(dá)27%!如何構(gòu)建一個真正可靠的消息中間件架構(gòu)?本文將深入剖析RabbitMQ高可用設(shè)計的核心要點。
    的頭像 發(fā)表于 08-18 11:19 ?726次閱讀

    深入剖析Docker全鏈路安全防護策略

    在云原生時代,Docker容器安全已成為運維工程師必須面對的核心挑戰(zhàn)。本文將從實戰(zhàn)角度深入剖析Docker全鏈路安全防護策略,涵蓋鏡像構(gòu)建、容器運行、網(wǎng)絡(luò)隔離等關(guān)鍵環(huán)節(jié),助你構(gòu)建企業(yè)級安全防護體系。
    的頭像 發(fā)表于 08-18 11:17 ?772次閱讀

    研華工業(yè)AI Agent的發(fā)展態(tài)勢及實踐思考

    WISE-IoT 產(chǎn)品總監(jiān)康寧女士,深入剖析工業(yè) AI Agent 的發(fā)展態(tài)勢及實踐思考,期待為您揭開產(chǎn)業(yè)智能化躍遷的全新篇章。
    的頭像 發(fā)表于 06-23 09:31 ?852次閱讀

    深入剖析智芯傳感開口封封裝技術(shù)

    封裝是MEMS制造過程的重要環(huán)節(jié),決定了MEMS器件的可靠性和成本。開口封封裝技術(shù)是智芯傳感在封裝工藝上的一次創(chuàng)新突破。這一創(chuàng)新技術(shù)不僅攻克了MEMS壓力傳感芯片一體化塑封的這一世界級難題,還憑借其卓越的性能與高效生產(chǎn)優(yōu)勢,引領(lǐng)著行業(yè)的技術(shù)升級。本文將深入剖析開口封封裝技
    的頭像 發(fā)表于 03-19 10:39 ?1206次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>智芯傳感開口封封裝技術(shù)

    BNC接頭技術(shù)原理與工程應(yīng)用剖析:從結(jié)構(gòu)到性能優(yōu)化

    在現(xiàn)代電子通信和射頻領(lǐng)域,BNC接頭作為一種廣泛應(yīng)用的連接器件,發(fā)揮著至關(guān)重要的作用。它以其可靠的連接性能、優(yōu)異的電氣特性和廣泛的兼容性,成為眾多電子設(shè)備和系統(tǒng)中不可或缺的一部分。本文將深入剖析
    的頭像 發(fā)表于 12-31 16:07 ?2289次閱讀
    BNC接頭技術(shù)原理與<b class='flag-5'>工程</b>應(yīng)用<b class='flag-5'>剖析</b>:從結(jié)構(gòu)到性能優(yōu)化