Netty編解碼方案之Protobuf介紹
- 2020 年 1 月 26 日
- 筆記
Protobuf介紹
1. Netty本身的編碼解碼的機制和問題分析
Netty 自身提供了一些 codec(編解碼器)
Netty 提供的編碼器 StringEncoder,對字符串數據進行編碼 ObjectEncoder,對 Java 對象進行編碼 … Netty 提供的解碼器 StringDecoder, 對字符串數據進行解碼 ObjectDecoder,對 Java 對象進行解碼 … Netty 本身自帶的 ObjectDecoder 和 ObjectEncoder 可以用來實現 POJO 對象或各種業務對象的編碼和解碼,底層使用的仍是 Java 序列化技術 , 而Java 序列化技術本身效率就不高,存在如下問題
- 無法跨語言
- 序列化後的體積太大,是二進制編碼的 5 倍多。
- 序列化性能太低
2.Google Protobuf
Protobuf
是 Google 發佈的開源項目,全稱 Google Protocol Buffers,是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC[遠程過程調用 remote procedure call ] 數據交換格式 。目前很多公司 http+json
-> tcp+protobuf
參考文檔 : https://developers.google.com/protocol-buffers/docs/proto Protobuf 是以 message
的方式來管理數據的. 支持跨平台、跨語言,即[客戶端和服務器端可以是不同的語言編寫的] (支持目前絕大多數語言,例如 C++、C#、Java、python 等)
高性能
,高可靠性
使用 protobuf 編譯器能自動生成代碼,Protobuf 是將類的定義使用.proto 文件進行描述。說明,在idea 中編寫 .proto 文件時,會自動提示是否下載 .ptotot 編寫插件. 可以讓語法高亮。然後通過 protoc.exe 編譯器根據.proto 自動生成.java 文件 protobuf 使用示意圖
3.具體使用
1.導入依賴
要使用protobuf
我們需要導入相關的jar文件
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.6.1</version> </dependency>
2.創建proto文件
創建Student.proto
文件。在IEDA中會提示安裝相關的插件,如下
直接點擊即可
安裝完成後重啟idea即可,然後再看 proto類型的文件,會有對應的logo,語法也會相應的高亮。
文件內容:
syntax = "proto3";// 設置相關版本 option java_outer_classname = "StudentPojo"; // 生成的外部類名稱,同時也是文件名 // protobuf 使用 message管理數據 message Student{ // 會在StudentPojo外部類生成一個內部類Student,這個是真正發送的POJO對象 int32 id = 1; // Student類中有一個屬性 名稱為id 類型為 int32 1 表示 屬性序號 string name = 2; // 2 也表是屬性序號 不是值 }
3.生成對於的POJO對象
通過proto.exe文件來生成對於的POJO文件,如下
命令:
proto.exe --java_out=. Student.proto
然後將文件拷貝到項目中
4.客戶端服務器操作
接下來我們實現一個netty的通信,發送的是一個POJO對象,然後通過protobuf來實現對應的編解碼
操作 服務端解碼
服務端獲取信息
客戶端編碼
客戶端發送信息
5.效果演示
分別啟動服務器和客戶端然後查看輸出:
客戶端發送的是自定義的POJO對象的數據,通過Protobuf來編碼,服務器對應的通過Protobuf來解碼,實現了數據的傳遞。