一、Protobuf是什么
Protobuf 是 Google 發布的開源項目,全稱 Google Protocol(/'prəʊtəkɒl/,協議,草案) Buffers,是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC[遠程過程調用 remote procedure call ] 數據交換格式 。目前很多公司 http+json ==> tcp+protobuf
參考文檔 : https://developers.google.com/protocol-buffers/docs/proto 語言指南
二、為什么要使用Protobuf
1、Netty 本身的編碼解碼機制存在的問題
1.1 Netty 自身提供的 codec(編/解碼器)
Netty 提供的編碼器
StringEncoder,對字符串數據進行編碼
ObjectEncoder,對 Java 對象進行編碼
...
Netty 提供的解碼器
StringDecoder, 對字符串數據進行解碼
ObjectDecoder,對 Java 對象進行解碼
...
1.2 Netty 自身的 codec存在的問題
Netty 本身自帶的 ObjectDecoder 和 ObjectEncoder 可以用來實現 POJO 對象或各種業務對象的編碼和解碼,底層使用的仍是 Java 序列化技術 , 而Java 序列化技術本身效率就不高,存在如下問題:
1.無法跨語言
2.序列化后的體積太大,是二進制編碼的 5 倍多。
3.序列化性能太低4.Protobuf 是以 message (信息)的方式來管理數據的.
5.支持跨平台、跨語言,即[客戶端和服務器端可以是不同的語言編寫的] (支持目前絕大多數語言,例如 C++、C#、Java、python 等)
6.高性能,高可靠性
7.使用 protobuf 編譯器能自動生成代碼,Protobuf 是將類的定義使用.proto 文件進行描述。說明,在idea 中編寫 .proto 文件時,會自動提示是否下載 .ptotot 編寫插件. 可以讓語法高亮。8.然后通過 protoc.exe 編譯器根據.proto 自動生成.java 文件
2、protobuf 工作示意圖
三、IDEA安裝Protobuf
一、.proto文件語法高亮顯示需要安裝Protobuf Support插件:
網上的教程:
依次點擊Intellij中的“File”>"Settings>"Plugins"==>"Browse repositories",輸入Protobuf,點擊install:
而我的idea是2019.1版本,Plugins下面沒有Browse repositories這個選項,選擇磁盤安裝:
先進入官方地址下載插件:protobuf插件
將插件下載到桌面(不用解壓),打開idea,依次點擊:
“File”>"Settings>"Plugins">"設置按鈕">"install Plugin from Disk"==>找到剛剛下載的文件並且選中,之后會出現protobuf Support插件,選擇重啟Idea(Restart IDE),然后之前寫的XXX.proto文件就會變顏色。
四、maven的方式集成插件
在pom文件中引入依賴:
<properties>
<java.version>1.8</java.version>
<protobuf.version>3.7.0</protobuf.version>
<grpc.version>1.9.1</grpc.version>
</properties>
<dependencies>
<!--protobuf3-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.7.0</version>
</dependency>
<!--grpc-->
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>${grpc.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>${grpc.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>