【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:
- 啥叫平臺(tái)無(wú)關(guān)?Linux卡者、mac和Windows都可以用蒿囤,32位系統(tǒng),64位系統(tǒng)通吃
- 啥叫語(yǔ)言無(wú)關(guān)崇决?C++材诽、Java、Python恒傻、Golang語(yǔ)言編寫(xiě)的程序都可以用脸侥,而且可以相互通信
- 那啥叫可擴(kuò)展呢?就是這個(gè)數(shù)據(jù)格式可以方便的增刪一部分字段啦~
- 最后碌冶,啥叫序列化啊涝缝?解釋得通俗點(diǎn)兒就是把復(fù)雜的結(jié)構(gòu)體數(shù)據(jù)按照一定的規(guī)則編碼成一個(gè)字節(jié)切片
13.2 數(shù)據(jù)交換格式
A)常用的數(shù)據(jù)交換格式有三種:
-
json
: 一般的web項(xiàng)目中扑庞,最流行的主要還是 json譬重。因?yàn)闉g覽器對(duì)于json 數(shù)據(jù)支持非常好,有很多內(nèi)建的函數(shù)支持罐氨。 -
xml
: 在 webservice 中應(yīng)用最為廣泛臀规,但是相比于 json,它的數(shù)據(jù)更加冗余栅隐,因?yàn)樾枰蓪?duì)的閉合標(biāo)簽塔嬉。json 使用了鍵值對(duì)的方式,不僅壓縮了一定的數(shù)據(jù)空間租悄,同時(shí)也具有可讀性谨究。 -
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)注明出處