91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

Google二進制編解碼技術之Protobuf 1

jf_78858299 ? 來源: 碼農的荒島求生 ? 作者:陸小風 ? 2023-02-15 14:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

計算機網絡編程中一個非常基本的問題:該怎樣表示client與server之間交互的數(shù)據(jù),在往下看之前先想一想這個問題。

共識與協(xié)議

這個問題可不像看上去的那樣簡單,因為client進程和server進程運行在不同的機器上,這些機器可能運行在不同的處理器平臺、可能運行在不同的操作系統(tǒng)、可能是由不同的編程語言編寫的,server要怎樣才能識別出client發(fā)送的是什么數(shù)據(jù)呢?就像這樣:圖片client給server發(fā)送了一段數(shù)據(jù):

0101000100100001

server怎么能知道該怎樣“解讀”這段數(shù)據(jù)呢?

顯然,client和server在發(fā)送數(shù)據(jù)之前必須首先達成某種關于怎樣解讀數(shù)據(jù)的共識,這就是所謂的 協(xié)議

這里的協(xié)議可以是這樣的:“將每8個比特為一個單位解釋為無符號數(shù)字”,如果協(xié)議是這樣的,那么server接收到這串二進制后就會將其解析為81(01010001)與33(00100001)。

當然,這里的協(xié)議也可以是這樣的:“將每8個比特為一個單位解釋為ASCII字符”,那么server接收到這串二進制后就將其解析為“Q!”。

可見,同樣一串二進制在不同的“上下文/協(xié)議”下有完全不一樣的解讀,這也是為什么計算機明明只認知0和1但是卻能處理非常復雜任務的根本原因,因為一切都可以編碼為0和1,同樣的我們也可以從0和1中解析出我們想要的信息,這就是所謂的編解碼技術。

實際上不止0和1,我們也可以將信息編碼為摩斯密碼(Morse code)等,只不過計算機擅長處理0和1而已。

扯遠了,回到本文的主題。

遠程過程調用:RPC

作為程序員我們知道,client以及server之間不會簡單傳遞一串數(shù)字以及字符這樣簡單,尤其在互聯(lián)網大廠后端服務這種場景下。

當我們在電商App搜索商品、打車App呼叫出租車以及刷短視頻時,每一次請求的背后在后端都涉及大量服務之間的交互,就像這樣:

圖片

完成一次客戶端請求gateway這個服務要調用N多個下游服務,所謂調用是說A服務向B服務發(fā)送一段數(shù)據(jù)(請求),B服務接收到這段數(shù)據(jù)后執(zhí)行相應的函數(shù),并將結果返回給A服務。

只不過對于服務A來說并不想關心網絡傳輸這樣的底層細節(jié),如果能像調用本地函數(shù)一樣調用遠程服務就好了,這就是所謂的RPC,經典的實現(xiàn)方式是這樣的:

圖片

RPC對上層提供和普通函數(shù)一樣的接口,只不過在實現(xiàn)上封裝了底層復雜的網絡通信,RPC框架是當前互聯(lián)網后端的基石之一,很多所謂互聯(lián)網后端的職位無非就是在此基礎之上堆業(yè)務邏輯。

本文我們不關心其中的細節(jié),這里我們只關心在網絡層client是怎樣對請求參數(shù)進行編碼、server怎樣對請求參數(shù)進行解碼的,也就是本文開頭提出的問題。

信息的編解碼

在思考怎樣進行編解碼之前我們必須意識到:

  • client和server可能是用不同語言編寫的,你的編解碼方案必須通用且不能和語言綁定
  • 編解碼方法的性能問題,尤其是對時間要求苛刻的服務

首先,我們最應該能想到的就是以純文本的形式來表示。

純文本從來都是一種非常有友好的信息載體,為什么?很簡單,因為人類(我們)可以直接看懂,就像這段:

{
 "widget": {
  "window": {
   "title": "Sample Konfabulator Widget",
   "name": "main_window",
   "width": 500,
   "height": 500
  },
  "image": { 
   "src": "Images/Sun.png",
   "name": "sun1",
   "hOffset": 250,
   "vOffset": 250,
  },
 }
}

是不是很清晰,一目了然,只要我們實現(xiàn)約定好文本的結構(也就是語法),那么client和server就能利用這種文本進行信息的編碼以及解碼,不管client和server是運行在x86還是Arm、是32位的還是64位的、運行在Linux上還是windows上、是大端還是小端,都可以無障礙交流。

因此在這里,文本的語法就是一種協(xié)議。圖片順便說一句, 你都規(guī)定好了文本的語法,實際上就相當于發(fā)明了一種語言

這里用來舉例用的語言就是所謂的Json,只不過json這種語言不是用來表示邏輯(代碼)而是用來存儲數(shù)據(jù)的。

Json就是這個老頭提出來的:

除了Json,另一種利用文本存儲數(shù)據(jù)的表示方法是XML,來一段感受下:

<note>
<to>Toveto>
<from>Janifrom>
<heading>Reminderheading>
<body>Don't forget me this weekend!body>
note>

相對Json來說是不是就沒那么容易看懂了,Json出現(xiàn)后在web領域逐漸取代了XML。

當兩段數(shù)據(jù)量很少的時候——就像瀏覽器和服務端的交互,Json可以工作的非常好,這個場景就是這里:圖片在這里是json的天下。

但對于后端服務之間的交互來說就不一樣了,后端服務之間的RPC調用可能會傳輸大量數(shù)據(jù),如果全部用純文本的形式來表示數(shù)據(jù)那么不管是網絡帶寬還是性能可能都會差強人意。圖片

在這種場景下,Json并不是最好的選項,主要原因之一就在于性能以及數(shù)據(jù)的體積。

我們知道,文本表示對人類是最友好的,對機器來說則不是這樣,對機器來說最好的還是01二進制。

那么有沒有二進制的編碼方法嗎?答案是肯定的,這就是當前互聯(lián)網后端中流行的protobuf,Google公司開源項目。

那么protobuf有什么神奇之處嗎?

假設client端想給server端傳輸這樣一段信息:“我有一個id,其值為43”,那么在XML下是這樣表示的:

<id>43id>

數(shù)一數(shù)這這段數(shù)據(jù)占據(jù)了多少字節(jié),很顯然是11字節(jié);

而如果用json來表示呢?

{"id":43}

數(shù)一數(shù)這段數(shù)據(jù)占據(jù)了多少字節(jié),顯然是9字節(jié);

而如果用protobuf來表示呢? 是這樣的:

// 消息定義
message Msg {
  optional int32 id = 1;
}

// 實例化
Msg msg;
msg.set_id(43);

其中Msg的定義看上去比Json和XML更加復雜了,但這些只是給人看的,這些還會被protbuf進一步處理,最終被編碼為:

082b

也就是0x08與0x2b,這占據(jù)了多少字節(jié)呢?答案是2字節(jié)。

從json的9字節(jié)到protobuf的2字節(jié),數(shù)據(jù)大小減少了4倍多,數(shù)據(jù)量的減少意味著:

  • 更少的網絡帶寬
  • 更快的解析速度

那么protobuf是怎樣做到這一點的呢?

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

    關注

    19

    文章

    7663

    瀏覽量

    90798
  • Server
    +關注

    關注

    0

    文章

    94

    瀏覽量

    24699
  • 網絡編程
    +關注

    關注

    0

    文章

    72

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    探討2對4二進制解碼器及4到16二進制解碼器配置

    二進制解碼器是由單獨的邏輯門構成的另一種組合邏輯電路,與編碼器完全相反。名稱“解碼器”是指將編碼信息從一種格式轉換或解碼為另一種格式,因此二進制
    的頭像 發(fā)表于 12-29 12:10 ?1.2w次閱讀
    探討2對4<b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器及4到16<b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器配置

    二進制相對調相(二進制差分調相2DPSK)的工作原理

    二進制相對調相(二進制差分調相2DPSK)的工作原理
    發(fā)表于 10-21 13:01 ?3333次閱讀
    <b class='flag-5'>二進制</b>相對調相(<b class='flag-5'>二進制</b>差分調相2DPSK)的工作原理

    二進制

    二進制   二進制與十進制的區(qū)別在于數(shù)碼的個數(shù)和進位規(guī)律有很大的區(qū)別,顧名思義,二進制的計數(shù)規(guī)律為逢二進一,是以2為基數(shù)的計數(shù)體制。10這
    發(fā)表于 04-06 23:48 ?8510次閱讀
    <b class='flag-5'>二進制</b>

    二進制時鐘電路

    二進制時鐘電路
    發(fā)表于 09-11 11:22 ?3212次閱讀
    <b class='flag-5'>二進制</b>時鐘電路

    同步二進制計數(shù)器

    同步二進制計數(shù)器 1.   同步與異步二進制加法計數(shù)器比較態(tài)序表和工作波形一樣電路結構不同:  異步二進制加法
    發(fā)表于 09-30 18:37 ?1.3w次閱讀
    同步<b class='flag-5'>二進制</b>計數(shù)器

    二進制編碼和二進制數(shù)據(jù)

    二進制編碼和二進制數(shù)據(jù)   二進制編碼是計算機內使用最多的碼制,它只使用兩個基本符號"0"和"1",并且通過由這兩個符號組成的
    發(fā)表于 10-13 16:22 ?5021次閱讀

    二進制數(shù)的運算規(guī)則

    二進制數(shù)的運算規(guī)則  二進制數(shù)之間可以執(zhí)行算術運算和邏輯運算,其規(guī)則簡單,容易實現(xiàn)。  (1) 加法運算規(guī)則    0 + 0 = 0         例如:
    發(fā)表于 10-13 16:24 ?2.3w次閱讀

    什么是二進制計數(shù)器,二進制計數(shù)器原理是什么?

    什么是二進制計數(shù)器,二進制計數(shù)器原理是什么? 計數(shù)器是數(shù)字系統(tǒng)中用得較多的基本邏輯器件。它不僅能記錄輸入時鐘脈沖的個數(shù),還可以實現(xiàn)
    發(fā)表于 03-08 13:16 ?3.2w次閱讀

    二進制電平,什么是二進制電平

    二進制電平,什么是二進制電平 在二進制數(shù)字通信系統(tǒng)中,每個碼元或每個符號只能是“1”和“0”兩個狀態(tài)之一。若將每個碼元可能取的狀態(tài)增
    發(fā)表于 03-17 16:51 ?2510次閱讀

    二進制加法程序【匯編版】

    二進制加法程序【匯編版】二進制加法程序【匯編版】二進制加法程序【匯編版】二進制加法程序【匯編版】
    發(fā)表于 12-29 11:02 ?0次下載

    二進制加法程序【C語言版】

    二進制加法程序【C語言版】二進制加法程序【C語言版】二進制加法程序【C語言版】二進制加法程序【C語言版】
    發(fā)表于 12-29 11:03 ?0次下載

    二進制數(shù)據(jù)壓縮算法

    二進制數(shù)據(jù)壓縮算法二進制是計算技術中廣泛采用的一種數(shù)制。二進制數(shù)據(jù)是用0和1兩個數(shù)碼來表示的數(shù)。它的基數(shù)為2,進位規(guī)則是“逢
    的頭像 發(fā)表于 02-28 09:31 ?2.1w次閱讀

    二進制解碼器案例說明

    二進制解碼器是另一種由各個邏輯門構成的組合邏輯電路,與編碼器完全相反。
    的頭像 發(fā)表于 06-22 09:41 ?1w次閱讀
    <b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器案例說明

    二進制解碼器到底是什么

    二進制解碼器是由單獨的邏輯門構成的另一種組合邏輯電路,與編碼器完全相反。名稱“解碼器”是指將編碼信息從一種格式轉換或解碼為另一種格式,因此二進制
    發(fā)表于 01-03 17:42 ?6691次閱讀
    <b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器到底是什么

    二進制解碼器開源設計

    電子發(fā)燒友網站提供《二進制解碼器開源設計.zip》資料免費下載
    發(fā)表于 06-16 15:01 ?0次下載
    <b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器開源設計
    主站蜘蛛池模板: 久久亚洲精选 | 男男扒开后菊惩罚 | 91av免费 | а8天堂资源在线官网 | 国产一级特黄的片子 | ww欧美| 色爱区综合五月激情 | h在线国产| 女人大毛片一级毛片一 | 一级特黄aaa大片免色 | 大色综合色综合资源站 | 日本卡一卡2卡3卡4精品卡无人区 | 免费高清视频在线观看 | 国产一区二区三区不卡观 | 奇米9999 | 亚洲qingse中文在线 | 河南毛片 | 欧美性free免费 | 美国色天使 | 2020狠狠操 | 免费福利午夜影视网 | 国产综合视频 | 在线 你懂的 | 亚洲一区免费视频 | 成年女人色费视频免费 | 久久精品免视看国产成人2021 | 日本黄色网页 | 国产日韩精品欧美一区色 | 成人一级视频 | 中文字幕一二三四区2021 | 有码视频在线观看 | 五月婷婷在线免费观看 | 色丁香在线| 天天干一干 | 国产r67194吃奶视频 | 午夜视频国产 | 日韩免费毛片 | 欧美地区一二三区 | 亚洲人成一区 | 四虎国产精品4hu永久 | 超黄视频网站 |