本文我們來給大家介紹下Netty中對傳輸數據編解碼的解決方案ProtoBuf
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來解碼,實現了數據的傳遞