在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

Linux愛好者 ? 來源:vivo互聯網技術 ? 作者:Li Guanyun ? 2021-11-16 09:15 ? 次閱讀

ProtoBuf 作為一種跨平臺、語言無關、可擴展的序列化結構數據的方法,已廣泛應用于網絡數據交換及存儲。隨著互聯網的發展,系統的異構性會愈發突出,跨語言的需求會愈加明顯,同時 gRPC 也大有取代Restful之勢,而 ProtoBuf 作為g RPC 跨語言、高性能的法寶,我們技術人有必要

深入理解 ProtoBuf 原理,為以后的技術更新和選型打下基礎。

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

一、什么是ProtoBuf

ProtoBuf(Protocol Buffers)是一種跨平臺、語言無關、可擴展的序列化結構數據的方法,可用于網絡數據交換及存儲。

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

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

二、為什么是 ProtoBuf

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

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

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

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

這也就是每個服務器開發人員都遇到過的低版本兼容、新舊協議兼容相關的問題。

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

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

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

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

不過隨著系統慢慢發展,演進,ProtoBuf具有了更多的特性:

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

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

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

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 協議的工作流程

可以看到,對于序列化協議來說,使用方只需要關注業務對象本身,即 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,兩個版本語法不兼容,如果不指定,默認語法是proto2。由于proto3比proto2支持的語言更多,語法更簡潔,本文使用的是proto3。

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

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

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

3.3 代碼生成

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

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

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

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

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 性能數據

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

序列化耗時以及序列化后數據大小對比

反序列化耗時

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

更多性能數據可以參考官方 Benchmark[3]

四、總結

上面介紹了 ProtoBuf 是什么、產生的背景、基本用法,我們再總結下。

優點:

1. 效率高

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

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

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

2. 支持跨平臺、多語言

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

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

3. 擴展性、兼容性好

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

4. 使用簡單

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

缺點

可讀性差,缺乏自描述

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

ProtoBuf是二進制協議,編碼后的數據可讀性差,如果沒有idl文件,就無法理解二進制數據流,對調試不友好。

不過Charles已經支持ProtoBuf協議,導入數據的描述文件即可,詳情可參考Charles Protocol Buffers[4]

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

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • XML
    XML
    +關注

    關注

    0

    文章

    188

    瀏覽量

    33086
  • 編碼
    +關注

    關注

    6

    文章

    943

    瀏覽量

    54838
  • JSON
    +關注

    關注

    0

    文章

    117

    瀏覽量

    6969

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

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

收藏 人收藏

    評論

    相關推薦

    深入剖析2.5D封裝技術優勢及應用

    的一項重要創新,不僅提高了芯片的性能和集成度,還為未來的芯片設計提供了更多的可能性。本文將深入剖析2.5D封裝技術的內涵、優勢及其在現代半導體工業中的應用。 一、芯片封裝的重要性 封裝作為半導體制造流程中的關鍵環節,其核心作用在
    的頭像 發表于 11-22 09:12 ?1069次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>2.5D封裝技術優勢及應用

    精確溫控技術在焊接電源中的應用與實踐探析

    節能等方面都起到了決定性的作用。以下將對精確溫控技術在焊接電源中的應用與實踐進行深入剖析。 首先,精確溫控技術是現代焊接電源的核心組成部分之一。焊接過程中,溫度控
    的頭像 發表于 11-19 09:08 ?213次閱讀
    精確溫控技術在焊接電源中的應用與<b class='flag-5'>實踐</b>探析

    光儲充一體化電站建設關鍵技術:深入剖析與研究

    安科瑞魯一揚15821697760 摘要:光儲充一體化電站的建設已然邁入高速發展的軌道。本研究先對光儲充一體化電站建設的關鍵意義與實際現狀予以簡要闡述,進而深入剖析光儲充電站建設的系統架構與控制模式
    的頭像 發表于 11-12 17:01 ?305次閱讀
    光儲充一體化電站建設關鍵技術:<b class='flag-5'>深入</b><b class='flag-5'>剖析</b>與研究

    深入剖析石英 CMOS 振蕩器 PC3225 系列(1 to 200 MHz)的卓越性能

    深入剖析石英 CMOS 振蕩器 PC3225 系列(1 to 200 MHz)的卓越性能
    的頭像 發表于 08-08 10:14 ?362次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>石英 CMOS 振蕩器 PC3225 系列(1 to 200 MHz)的卓越性能

    熱烈歡迎清華大學電子工程系學子來武漢六博光電交流實踐

    近日,武漢六博光電技術有限責任公司接到清華大學函件,正式成為清華大學電子工程系武漢實踐基地之一。2024年8月1日上午,清華大學電子工程實踐團隊一行共計13名學子前往武漢六博光電有限
    的頭像 發表于 08-02 08:37 ?513次閱讀
    熱烈歡迎清華大學電子<b class='flag-5'>工程</b>系學子來武漢六博光電交流<b class='flag-5'>實踐</b>!

    振弦采集儀的工程安全監測實踐與案例分析

    振弦采集儀的工程安全監測實踐與案例分析 振弦采集儀是一種常用的工程安全監測儀器,通過測量被監測結構的振動頻率與振型,可以實時監測結構的安全狀況。本文將結合實踐經驗和案例分析,探討振弦采
    的頭像 發表于 07-01 11:01 ?246次閱讀
    振弦采集儀的<b class='flag-5'>工程</b>安全監測<b class='flag-5'>實踐</b>與案例分析

    深入剖析“復坦希UVLED固化爐”的工作原理與技術創新

    在現代工業制造中,UV固化技術因其高效、環保的特點而受到廣泛關注。在眾多UV固化設備中,“復坦希UVLED固化爐”憑借其獨特的工作原理和卓越的技術創新,成為行業內的佼佼者。本文將深入剖析這款設備
    的頭像 發表于 05-28 14:32 ?483次閱讀

    【大語言模型:原理與工程實踐】探索《大語言模型原理與工程實踐》2.0

    《大語言模型“原理與工程實踐”》是關于大語言模型內在機理和應用實踐的一次深入探索。作者不僅深入討論了理論,還提供了豐富的
    發表于 05-07 10:30

    【大語言模型:原理與工程實踐】探索《大語言模型原理與工程實踐

    的未來發展方向進行了展望,包括跨領域、跨模態和自動提示生成能力方向,為讀者提供了對未來技術發展的深刻見解?!洞笳Z言模型原理與工程實踐》是一本內容豐富、深入淺出的技術書籍。它不僅為讀者提供了大語言模型
    發表于 04-30 15:35

    振弦采集儀在橋梁工程監測中的優勢與實踐案例

    振弦采集儀在橋梁工程監測中的優勢與實踐案例 在橋梁工程監測中,振弦采集儀是一種常用的監測設備。它的主要功能是通過采集橋梁振動信號,實時監測橋梁的結構健康狀態。與傳統的監測方法相比,振弦采集儀具有一些
    的頭像 發表于 04-01 14:03 ?289次閱讀
    振弦采集儀在橋梁<b class='flag-5'>工程</b>監測中的優勢與<b class='flag-5'>實踐</b>案例

    深入剖析電機產品的實際槽滿率問題

    本篇文章深入剖析電機產品的實際槽滿率問題。需要注意的是,存在一種由于生產限制而降低的槽滿率,這主要出現在使用針嘴式繞線機的電機中,因為這種設備需要預留針嘴操作的空間。? 槽滿率的高低對電機的效率有
    的頭像 發表于 03-26 08:44 ?553次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>電機產品的實際槽滿率問題

    智慧社區新模式:分布式綜合管理平臺工程實踐分享

    將結合工程實踐,分享訊維分布式綜合管理平臺在智慧社區建設中的應用與成效。 一、項目背景與目標 某城市為了提升社區治理水平、優化居民生活體驗,決定引入智慧社區建設。經過深入調研和比較,該城市選擇了訊維分布式綜
    的頭像 發表于 03-18 16:05 ?345次閱讀

    名單公布!【書籍評測活動NO.31】大語言模型:原理與工程實踐

    深入理解和廣泛應用,推動整個領域的持續發展和創新。 本書特色 本書旨在揭開大語言模型的神秘面紗,透徹地解讀其內在機理和應用實踐。書中不僅介紹理論知識,更介紹了深入這一技術領域的具體訓練過程,目的是為
    發表于 03-18 15:49

    深入剖析開關電源的電感電流選擇

    電感常常被理解為開關電源輸出端中的LC濾波電路中的L(C是其中的輸出電容)。雖然這樣理解是正確的,但是為了理解電感的設計就必須更深入的了解電感的行為。
    發表于 01-10 17:03 ?890次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>開關電源的電感電流選擇

    深入剖析人工智能應用價值與場景分析

    人工智能進入生成式階段,本報告重點對人工智能應用價值與場景分析,并對企業AI應用突破方向與規劃建議,針對營銷/服務、辦公協同、研發、企業安全等各個環節進行深入剖析,展開企業AI智能應用全景與規劃建議。
    發表于 01-05 11:15 ?328次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>剖析</b>人工智能應用價值與場景分析
    主站蜘蛛池模板: 奇米99| 5252色欧美在线激情| 日本免费看黄| 日韩特级| 欧美日韩一日韩一线不卡| 亚洲综合天堂网| 一级做a爰片久久毛片毛片| xxxx性欧美高清| 91国内视频| 欧美精品人爱a欧美精品| 黄色国产在线观看| 一区二区三区四区无限乱码在线观看 | 成人在线一区二区三区| 午夜一级免费视频| 手机看片福利日韩国产| 亚洲午夜精品一区二区| 成人免费播放视频777777| 手机看片1024在线| 97理论片| 五月天男人的天堂| 加勒比日本在线| 男啪女色黄无遮挡免费观看| 97天天操| 午夜黄色剧场| 亚洲国产成+人+综合| 亚洲人成电影院在线观看| 国产精品久久久香蕉| 久久精品国产精品亚洲精品| 人人澡人人人人夜夜爽| 亚洲欧美视频一区二区三区| 中文字幕一区二区三区视频在线 | 四虎影院在线看| 免费在线观看你懂的| 免费色在线| 爱爱的免费视频| 免费国产午夜在线观看| 清纯唯美亚洲综合一区| 色婷婷六月桃花综合影院| 日本美女视频网站| 性欧美精品| 亚洲最大的黄色网址|