SpringBoot 集成 Protocol Buffer案例

背景

最近工作中使用到 Protobuf,發現 Protobuf 的強大和方便之處,今天給大家介紹一個這個強大的工具的使用。畢竟有好東西要一起分享。

什麼是 Protobuf

首先我們來看下什麼是 protobuf, 官方解釋:Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler.

意思是: Protocol buffers是Google的語言中立,平臺中立,可擴展的機制,用於序列化結構化數據 - 類似XML,但更小,更快,更簡單。 使用 Protobuf 你可以編寫一次結構化數據一次,然後可以使用各種語言工具來生成對應語言的源代碼然後簡單的讀取或者操作數據。

抓重點,語言中立工具源代碼

使用

從上面的介紹中我們可以看到在使用 Protobuf 的使用需要有一個對應語言的工具,通過工具生成對應的源代碼,然後在操作相應結構的數據。下面我們依次看下具體是如何使用的。

  1. 首先我們這裡採用的是 java 語言,所以要先去下載 Java 對應的工具通過鏈接https://github.com/protocolbuffers/protobuf/releases/tag/v3.8.0下載 Java 的工具,macOS 可以直接使用brew install protobuf
  2. 編寫 .proto 文件,在使用 Protobuf 前,我們要編寫結構化的數據格式,例如我們這裡編寫 com-test-model-User.proto 文件
<code>//指定版本
syntax = "proto2";
//定義包名
package com.test.model;

//定義結構數據
message User {
//必選字段 第1個屬性
required string name = 1;
//必選字段 第2個屬性
required int32 age = 2;
//可選字段 第3個屬性
optional string comment = 3;
}

/<code>

編寫完了採用命令protoc --java_out=. ./com-test-model-User.proto,就會在當前路徑下生成相應的代碼結構。

SpringBoot 集成 Protocol Buffer案例

  1. 使用案例
<code>public class Test {

public static void main(String[] args) throws IOException {
UserOuterClass.User.Builder userBuilder = UserOuterClass.User.newBuilder();
userBuilder.setName("子悠");
userBuilder.setAge(18);
// userBuilder.setComment("this is comment");

System.out.println("\\n**********************序列化*****************************");
byte[] bytes = userBuilder.build().toByteArray();
System.out.println("bytes length is " + bytes.length);
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i] + " ");
}

System.out.println("\\n**********************反序列化*****************************");
UserOuterClass.User user = UserOuterClass.User.parseFrom(bytes);
System.out.println(user.getName());
}
}



//運行結果

**********************序列化*****************************
bytes length is 10
10 6 -27 -83 -112 -26 -126 -96 16 18
**********************反序列化*****************************
子悠

Process finished with exit code 0


/<code>
  1. 結果分析

可能到現在大家還沒有發現什麼優秀的地方,那麼讓我解釋下。從運行結果來看,序列化後的是一串數字。很簡短的一串數字。我們可以想一下如果這裡用的 JSON 格式的序列化的話那麼結果應該是{"name": "子悠", "age": 18},如果是 xml 的話,那就會更長,從這裡我們就可以看出 protobuf 的序列化的效果是多麼的強大,效率是多麼的高。我們知道在網絡傳輸的過程中,壓縮效率越高傳輸效率就越高。

<code> <user>
<name>子悠/<name>
18
/<user>
/<code>
  1. protobuf 優缺點
  • 更加簡單
  • 數據體積小 3- 10 倍
  • 更快的反序列化速度,提高 20 - 100 倍
  • 可以自動化生成更易於編碼方式使用的數據訪問類

小結

今天簡單給大家介紹了 protobuf 的簡單使用,更多的詳細使用,以及底層壓縮原理,感興趣的朋友可以自己的研究一下。另外說個題外話 protocol buffers 誕生之初是為了解決服務器端新舊協議(高低版本)兼容性問題,名字也很體貼,“協議緩衝區”。只不過後期慢慢發展成用於傳輸數據。

有時候就是這樣,一個項目或者軟件的最終形態並不是當時定義的模樣,隨著時間的推移產品的方向以及定位都會發生翻天覆地的變化。


分享到:


相關文章: