(14)數(shù)據(jù)傳輸協(xié)議protocol buffer(Reactor部分)-【Lars-基于C++負(fù)載均衡遠(yuǎn)程服務(wù)器調(diào)度系統(tǒng)教程】

【Lars教程目錄】

Lars源代碼
https://github.com/aceld/Lars


【Lars系統(tǒng)概述】
第1章-概述
第2章-項(xiàng)目目錄構(gòu)建


【Lars系統(tǒng)之Reactor模型服務(wù)器框架模塊】
第1章-項(xiàng)目結(jié)構(gòu)與V0.1雛形
第2章-內(nèi)存管理與Buffer封裝
第3章-事件觸發(fā)EventLoop
第4章-鏈接與消息封裝
第5章-Client客戶端模型
第6章-連接管理及限制
第7章-消息業(yè)務(wù)路由分發(fā)機(jī)制
第8章-鏈接創(chuàng)建/銷毀Hook機(jī)制
第9章-消息任務(wù)隊(duì)列與線程池
第10章-配置文件讀寫(xiě)功能
第11章-udp服務(wù)與客戶端
第12章-數(shù)據(jù)傳輸協(xié)議protocol buffer
第13章-QPS性能測(cè)試
第14章-異步消息任務(wù)機(jī)制
第15章-鏈接屬性設(shè)置功能


【Lars系統(tǒng)之DNSService模塊】
第1章-Lars-dns簡(jiǎn)介
第2章-數(shù)據(jù)庫(kù)創(chuàng)建
第3章-項(xiàng)目目錄結(jié)構(gòu)及環(huán)境構(gòu)建
第4章-Route結(jié)構(gòu)的定義
第5章-獲取Route信息
第6章-Route訂閱模式
第7章-Backend Thread實(shí)時(shí)監(jiān)控


【Lars系統(tǒng)之Report Service模塊】
第1章-項(xiàng)目概述-數(shù)據(jù)表及proto3協(xié)議定義
第2章-獲取report上報(bào)數(shù)據(jù)
第3章-存儲(chǔ)線程池及消息隊(duì)列


【Lars系統(tǒng)之LoadBalance Agent模塊】
第1章-項(xiàng)目概述及構(gòu)建
第2章-主模塊業(yè)務(wù)結(jié)構(gòu)搭建
第3章-Report與Dns Client設(shè)計(jì)與實(shí)現(xiàn)
第4章-負(fù)載均衡模塊基礎(chǔ)設(shè)計(jì)
第5章-負(fù)載均衡獲取Host主機(jī)信息API
第6章-負(fù)載均衡上報(bào)Host主機(jī)信息API
第7章-過(guò)期窗口清理與過(guò)載超時(shí)(V0.5)
第8章-定期拉取最新路由信息(V0.6)
第9章-負(fù)載均衡獲取Route信息API(0.7)
第10章-API初始化接口(V0.8)
第11章-Lars Agent性能測(cè)試工具
第12章- Lars啟動(dòng)工具腳本


13) 數(shù)據(jù)傳輸協(xié)議protocol buffer

13.1 簡(jiǎn)介

Google Protocol Buffer (簡(jiǎn)稱 Protobuf)是google旗下的一款輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式屉栓,平臺(tái)無(wú)關(guān)坯辩、語(yǔ)言無(wú)關(guān)、可擴(kuò)展,可用于通訊協(xié)議和數(shù)據(jù)存儲(chǔ)等領(lǐng)域件甥。所以很適合用做數(shù)據(jù)存儲(chǔ)和作為不同應(yīng)用,不同語(yǔ)言之間相互通信的數(shù)據(jù)交換格式,只要實(shí)現(xiàn)相同的協(xié)議格式即同一 proto文件被編譯成不同的語(yǔ)言版本,加入到各自的工程中去渊跋。這樣不同語(yǔ)言就可以解析其他語(yǔ)言通過(guò) protobuf序列化的數(shù)據(jù)。目前官網(wǎng)提供了 C++,Python,JAVA,GO等語(yǔ)言的支持着倾。google在2008年7月7號(hào)將其作為開(kāi)源項(xiàng)目對(duì)外公布拾酝。

tips:

  1. 啥叫平臺(tái)無(wú)關(guān)?Linux卡者、mac和Windows都可以用蒿囤,32位系統(tǒng),64位系統(tǒng)通吃
  2. 啥叫語(yǔ)言無(wú)關(guān)崇决?C++材诽、Java、Python恒傻、Golang語(yǔ)言編寫(xiě)的程序都可以用脸侥,而且可以相互通信
  3. 那啥叫可擴(kuò)展呢?就是這個(gè)數(shù)據(jù)格式可以方便的增刪一部分字段啦~
  4. 最后碌冶,啥叫序列化啊涝缝?解釋得通俗點(diǎn)兒就是把復(fù)雜的結(jié)構(gòu)體數(shù)據(jù)按照一定的規(guī)則編碼成一個(gè)字節(jié)切片

13.2 數(shù)據(jù)交換格式

A)常用的數(shù)據(jù)交換格式有三種:

  1. json: 一般的web項(xiàng)目中扑庞,最流行的主要還是 json譬重。因?yàn)闉g覽器對(duì)于json 數(shù)據(jù)支持非常好,有很多內(nèi)建的函數(shù)支持罐氨。
  2. xml: 在 webservice 中應(yīng)用最為廣泛臀规,但是相比于 json,它的數(shù)據(jù)更加冗余栅隐,因?yàn)樾枰蓪?duì)的閉合標(biāo)簽塔嬉。json 使用了鍵值對(duì)的方式,不僅壓縮了一定的數(shù)據(jù)空間租悄,同時(shí)也具有可讀性谨究。
  3. protobuf: 是后起之秀,是谷歌開(kāi)源的一種數(shù)據(jù)格式泣棋,適合高性能胶哲,對(duì)響應(yīng)速度有要求的數(shù)據(jù)傳輸場(chǎng)景。因?yàn)?profobuf 是二進(jìn)制數(shù)據(jù)格式潭辈,需要編碼和解碼鸯屿。數(shù)據(jù)本身不具有可讀性。因此只能反序列化之后得到真正可讀的數(shù)據(jù)把敢。

B)protobuf的優(yōu)勢(shì)與劣勢(shì)

優(yōu)勢(shì):

1:序列化后體積相比Json和XML很小寄摆,適合網(wǎng)絡(luò)傳輸

2:支持跨平臺(tái)多語(yǔ)言

3:消息格式升級(jí)和兼容性還不錯(cuò)

4:序列化反序列化速度很快,快于Json的處理速速

劣勢(shì):

1:應(yīng)用不夠廣(相比xml和json)

2:二進(jìn)制格式導(dǎo)致可讀性差

3:缺乏自描述


13.3 protobuf環(huán)境安裝

A) protobuf 編譯工具安裝

1修赞、下載 protoBuf:

cd $GOPATH/src/
git clone https://github.com/protocolbuffers/protobuf.git

2婶恼、或者直接將壓縮包拖入后解壓

unzip protobuf.zip 

3、安裝依賴庫(kù)

sudo apt-get install autoconf  automake  libtool curl make  g++  unzip libffi-dev -y

4榔组、進(jìn)入目錄

cd protobuf/ 

5熙尉、自動(dòng)生成configure配置文件:

./autogen.sh 

6、配置環(huán)境:

./configure

7搓扯、編譯源代碼(時(shí)間比較長(zhǎng)):

make 

8检痰、安裝

sudo make install

9、刷新共享庫(kù) (很重要的一步跋峭啤)

sudo ldconfig 

10铅歼、成功后需要使用命令測(cè)試

protoc -h  

13.4 protobuf與C++編程

? 首先創(chuàng)建一個(gè)msg.proto文件,里面定義協(xié)議的格式

protobuf_test/msg.proto

syntax="proto3";

package protobuf_test; 

message helloworld 
{ 
    int32     id = 1;  // ID   
    string    str = 2;  // str  
    int32     opt = 3;  //optional field 
}

? 寫(xiě)好 proto 文件之后就可以用 Protobuf 編譯器將該文件編譯成目標(biāo)語(yǔ)言了换可。本例中我們將使用 C++椎椰。

? 使用如下命令可以生成我們所需要的.cc與.h

protoc --cpp_out=. ./*.proto

? 執(zhí)行上述命令將生成msg.pb.cc與msg.pb.h,執(zhí)行時(shí)需要在文件msg.proto所在的目錄下執(zhí)行。

為了方便沾鳄,我們可以寫(xiě)一個(gè)腳本,方便下次執(zhí)行慨飘。

build.sh

#!/bin/bash
protoc --cpp_out=. ./*.proto

protobuf_test/write.cpp

#include "msg.pb.h"
#include <fstream>
#include <iostream>
using namespace std;

int main(void) 
{ 
    protobuf_test::helloworld msg1; 

    msg1.set_id(101); 
    msg1.set_str("hello"); 

    fstream output("./log", ios::out | ios::trunc | ios::binary); 

    if (!msg1.SerializeToOstream(&output)) { 
        cerr << "Failed to write msg." << endl; 
        return -1; 
    }        

    return 0; 
}

? Msg1 是一個(gè) helloworld 類的對(duì)象,set_id() 用來(lái)設(shè)置 id 的.SerializeToOstream 將對(duì)象序列化后寫(xiě)入一個(gè) fstream 流。當(dāng)擔(dān)序列化的接口還有很多比如SerializeToString, SerializeToArray等瓤的。

protobuf_test/read.cpp

#include "msg.pb.h"
#include <fstream>
#include <iostream>

using namespace std;

void ListMsg(const protobuf_test::helloworld & msg) {  
    cout << msg.id() << endl; 
    cout << msg.str() << endl; 
} 

int main(int argc, char* argv[]) { 

    protobuf_test::helloworld msg1; 

    fstream input("./log", ios::in | ios::binary); 
    if (!msg1.ParseFromIstream(&input)) { 
        cerr << "Failed to parse address book." << endl; 
        return -1; 
    }       

    ListMsg(msg1); 
}

? 現(xiàn)在進(jìn)行編譯:

$ g++ msg.pb.cc write.cpp -o write -lprotobuf  
$ g++ msg.pb.cc read.cpp -o read -lprotobuf 

? 執(zhí)行休弃,先執(zhí)行write,再執(zhí)行read。 write會(huì)將數(shù)據(jù)寫(xiě)進(jìn)log文件中圈膏,read可以通過(guò)pb協(xié)議解析出數(shù)據(jù)到內(nèi)存變量中.


關(guān)于作者:

作者:Aceld(劉丹冰)

mail: danbing.at@gmail.com
github: https://github.com/aceld
原創(chuàng)書(shū)籍gitbook: http://legacy.gitbook.com/@aceld

原創(chuàng)聲明:未經(jīng)作者允許請(qǐng)勿轉(zhuǎn)載, 如果轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塔猾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稽坤,更是在濱河造成了極大的恐慌丈甸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尿褪,死亡現(xiàn)場(chǎng)離奇詭異睦擂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)茫多,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)祈匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人天揖,你說(shuō)我怎么就攤上這事夺欲。” “怎么了今膊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵些阅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我斑唬,道長(zhǎng)市埋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任恕刘,我火速辦了婚禮缤谎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褐着。我一直安慰自己坷澡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布含蓉。 她就那樣靜靜地躺著频敛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馅扣。 梳的紋絲不亂的頭發(fā)上斟赚,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音差油,去河邊找鬼拗军。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的发侵。 我是一名探鬼主播侈咕,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼器紧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起楼眷,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铲汪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后罐柳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掌腰,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年张吉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了齿梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肮蛹,死狀恐怖勺择,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伦忠,我是刑警寧澤省核,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站昆码,受9級(jí)特大地震影響气忠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赋咽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一旧噪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脓匿,春花似錦淘钟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缤骨,卻和暖如春爱咬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绊起。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工精拟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓蜂绎,卻偏偏與公主長(zhǎng)得像栅表,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子师枣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容