Google Protobuf

JSON XML 編寫簡單废境,語義性更強(qiáng)豺鼻,protobuf編寫雖然復(fù)雜,但是序列化與反序列化速度更快薛窥,生成的二進(jìn)制數(shù)據(jù)量更小。

第 7 章 Google Protobuf

7.1 編碼和解碼的基本介紹

  1. 編寫網(wǎng)絡(luò)應(yīng)用程序時眼姐,因?yàn)閿?shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)亩际嵌M(jìn)制字節(jié)碼數(shù)據(jù)拆檬,在發(fā)送數(shù)據(jù)時就需要編碼,接收數(shù)據(jù) 時就需要解碼 [示意圖]
  2. codec(編解碼器) 的組成部分有兩個:decoder(解碼器)和 encoder(編碼器)妥凳。encoder 負(fù)責(zé)把業(yè)務(wù)數(shù)據(jù)轉(zhuǎn)換成字節(jié) 碼數(shù)據(jù)竟贯,decoder 負(fù)責(zé)把字節(jié)碼數(shù)據(jù)轉(zhuǎn)換成業(yè)務(wù)數(shù)據(jù)


    image.png

7.2 Netty 本身的編碼解碼的機(jī)制和問題分析

  1. Netty 自身提供了一些 codec(編解碼器)
  2. Netty 提供的編碼器 StringEncoder,對字符串?dāng)?shù)據(jù)進(jìn)行編碼 ObjectEncoder逝钥,對 Java 對象進(jìn)行編碼 ...
  3. Netty 提供的解碼器 StringDecoder, 對字符串?dāng)?shù)據(jù)進(jìn)行解碼 ObjectDecoder屑那,對 Java 對象進(jìn)行解碼 ...
  4. Netty 本身自帶的 ObjectDecoder 和 ObjectEncoder 可以用來實(shí)現(xiàn) POJO 對象或各種業(yè)務(wù)對象的編碼和解碼,底層使用的仍是 Java 序列化技術(shù) , 而 Java 序列化技術(shù)本身效率就不高艘款,存在如下問題 無法跨語言 序列化后的體積太大持际,是二進(jìn)制編碼的 5 倍多。 序列化性能太低
  5. => 引出 新的解決方案 [Google 的 Protobuf]

7.3 Protobuf

  1. Protobuf 基本介紹和使用示意圖
  2. Protobuf 是 Google 發(fā)布的開源項(xiàng)目哗咆,全稱 Google Protocol Buffers蜘欲,是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式, 可以用于結(jié)構(gòu)化數(shù)據(jù)串行化晌柬,或者說序列化姥份。它很適合做數(shù)據(jù)存儲或 RPC[遠(yuǎn)程過程調(diào)用 remote procedure call ] 數(shù)據(jù)交換格式 。 目前很多公司 http+json tcp+protobuf
  3. 參考文檔 : https://developers.google.com/protocol-buffers/docs/proto 語言指南
  4. Protobuf 是以 message 的方式來管理數(shù)據(jù)的.
  5. 支持跨平臺年碘、跨語言澈歉,即[客戶端和服務(wù)器端可以是不同的語言編寫的] (支持目前絕大多數(shù)語言,例如 C++屿衅、 C#埃难、Java、python 等)
  6. 高性能,高可靠性
  7. 使用 protobuf 編譯器能自動生成代碼涡尘,Protobuf 是將類的定義使用.proto 文件進(jìn)行描述忍弛。說明,在 idea 中編 寫 .proto 文件時考抄,會自動提示是否下載 .ptotot 編寫插件. 可以讓語法高亮剧罩。
  8. 然后通過 protoc.exe 編譯器根據(jù).proto 自動生成.java 文件
  9. protobuf 使用示意圖


    image.png

7.4 Protobuf 快速入門實(shí)例 編寫程序,使用 Protobuf 完成如下功能

  1. 客戶端可以發(fā)送一個 Student PoJo 對象到服務(wù)器 (通過 Protobuf 編碼)
  2. 服務(wù)端能接收 Student PoJo 對象座泳,并顯示信息(通過 Protobuf 解碼)
    導(dǎo)入maven
 <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.6.1</version>
        </dependency>

Student.proto

syntax = "proto3"; //版本 
option java_outer_classname = "StudentPOJO";//生成的外部類名,同時也是文件名 
//protobuf 使用 message 管理數(shù)據(jù) 
message Student { //會在 StudentPOJO 外部類生成一個內(nèi)部類 Student幕与, 他是真正發(fā)送的 POJO 對象 
int32 id = 1; // Student 類中有 一個屬性 名字為 id 類型為 
int32(protobuf 類型) 1 表示屬性序號挑势,不是值 string name = 2; }
IMG_2241(20201129-113132).JPG
IMG_2242(20201129-113204).JPG

案例1

NettyClient
NettyClientHandler
image.png

案例2

syntax = "proto3";
option optimize_for = SPEED; // 加快解析
option java_package="com.qiz.codec2";   //指定生成到哪個包下
option java_outer_classname="MyDataInfo"; // 外部類名

//protobuf 可以使用message 管理其他的message
message MyMessage {

    //定義一個枚舉類型
    enum DataType {
        StudentType = 0; //在proto3 要求enum的編號從0開始
        WorkerType = 1;
    }

    //用data_type 來標(biāo)識傳的是哪一個枚舉類型
    DataType data_type = 1;

    //表示每次枚舉類型最多只能出現(xiàn)其中的一個, 節(jié)省空間
    oneof dataBody {
        Student student = 2;
        Worker worker = 3;
    }

}


message Student {
    int32 id = 1;//Student類的屬性
    string name = 2; //
}
message Worker {
    string name=1;
    int32 age=2;
}
image.png

image.png

image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啦鸣,隨后出現(xiàn)的幾起案子潮饱,更是在濱河造成了極大的恐慌,老刑警劉巖诫给,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件香拉,死亡現(xiàn)場離奇詭異,居然都是意外死亡中狂,警方通過查閱死者的電腦和手機(jī)凫碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胃榕,“玉大人盛险,你說我怎么就攤上這事⊙郑” “怎么了苦掘?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長楔壤。 經(jīng)常有香客問我鹤啡,道長,這世上最難降的妖魔是什么蹲嚣? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任递瑰,我火速辦了婚禮,結(jié)果婚禮上隙畜,老公的妹妹穿的比我還像新娘泣矛。我一直安慰自己,他們只是感情好禾蚕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布您朽。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哗总。 梳的紋絲不亂的頭發(fā)上几颜,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音讯屈,去河邊找鬼蛋哭。 笑死,一個胖子當(dāng)著我的面吹牛涮母,可吹牛的內(nèi)容都是我干的谆趾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叛本,長吁一口氣:“原來是場噩夢啊……” “哼沪蓬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起来候,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跷叉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后营搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體云挟,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年转质,在試婚紗的時候發(fā)現(xiàn)自己被綠了园欣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡休蟹,死狀恐怖俊庇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸡挠,我是刑警寧澤辉饱,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拣展,受9級特大地震影響彭沼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜备埃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一姓惑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧按脚,春花似錦于毙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春介蛉,著一層夾襖步出監(jiān)牢的瞬間萌庆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工币旧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留践险,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓吹菱,卻偏偏與公主長得像巍虫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳍刷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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