Netty編解碼方案之Protobuf介紹

  本文我們來給大家介紹下Netty中對傳輸數據編解碼的解決方案ProtoBuf

Protobuf介紹

1. Netty本身的編碼解碼的機制和問題分析

Netty 自身提供了一些 codec(編解碼器)

Netty 提供的編碼器
StringEncoder,對字符串數據進行編碼
ObjectEncoder,對 Java 對象進行編碼

Netty 提供的解碼器
StringDecoder, 對字符串數據進行解碼
ObjectDecoder,對 Java 對象進行解碼

Netty 本身自帶的 ObjectDecoder 和 ObjectEncoder 可以用來實現 POJO 對象或各種業務對象的編碼和解碼,底層使用的仍是 Java 序列化技術 , 而Java 序列化技術本身效率就不高,存在如下問題

  1. 無法跨語言
  2. 序列化後的體積太大,是二進制編碼的 5 倍多。
  3. 序列化性能太低

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來解碼,實現了數據的傳遞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章