前言
Protocol Buffers
,是Google公司開發的一種資料描述語言,類似於XML能夠將結構化資料序列化,可用於資料儲存、通訊協議等方面。
它不依賴於語言和平臺並且可擴充套件性極強。現階段官方支援C++
、JAVA
、Python
三種程式語言,但可以找到大量的幾乎涵蓋所有語言的第三方擴充包。
google在2008年7月7號將其作為開源專案對外公佈
雖然Protocol Buffers
很早就被開源出來,被使用的頻率並沒有Json
和XML
多,大多數被用於遊戲開發協議,RPC
和即時通訊.然而這樣的資料交換利器比Json
和XML
的利處多太多了,但更小,更快,更簡單
該文章是繼是時候該瞭解一波Protocol Buffers了[Android]後的Java後臺SpringBoot快速整合Protocol Buffers
SpringBoot中快速使用Protocol Buffers
(一)SpringBoot 環境下Maven配置 Protocol Buffers編譯環境
-
setup 1
配置
protobuf
,protobuf-java-util
,protobuf-java-format
依賴<dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.googlecode.protobuf-java-format</groupId> <artifactId>protobuf-java-format</artifactId> <version>1.4</version> </dependency> </dependencies> 複製程式碼
注意:
-
protobuf-java-util
是protobuf
相關的工具類 -
protobuf-java-format
是可以將protobuf
轉換為Json
格式轉換器 -
setup 2
配置編譯器,編譯MAven外掛,檔案輸出環境
<plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.0</version> <extensions>true</extensions> <configuration> <!--預設值--> <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot> <!--預設值--> <!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>--> <!--<outputDirectory>${project.build.sourceDirectory}</outputDirectory>--> <!--設定是否在生成java檔案之前清空outputDirectory的檔案,預設值為true,設定為false時也會覆蓋同名檔案--> <clearOutputDirectory>false</clearOutputDirectory> <!--預設值--> <temporaryProtoFileDirectory>${project.build.directory}/protoc-dependencies </temporaryProtoFileDirectory> <!--更多配置資訊可以檢視https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html--> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> <!--也可以設定成區域性變數,執行compile或test-compile時才執行--> <!--<configuration>--> <!--<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>--> <!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>--> <!--<temporaryProtoFileDirectory>${project.build.directory}/protoc-dependencies</temporaryProtoFileDirectory>--> <!--</configuration>--> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <id>add-protobuf-generate-sources</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>target/generated-sources/protobuf/java</source> </sources> </configuration> </execution> <execution> <id>add-protobuf-generate-test-sources</id> <phase>generate-sources</phase> <goals> <goal>add-test-source</goal> </goals> <configuration> <sources> <source>target/generated-test-sources/protobuf/java</source> </sources> </configuration> </execution> </executions> </plugin> 複製程式碼
-
注意:
- 這裡的指定的輸出路徑是
arget/generated-sources/protobuf/java
,該路徑下的java檔案都是直接使用和打入jar包和war包
(二)java專案中編寫.proto檔案,生成java檔案
-
setup 1
java專案中編寫.proto檔案了.例如: 新建 Result.proto
package com.hk.protocolbuffer; // 關注1:包名 option java_package = "com.hk.protocolbuffer"; option java_outer_classname = "Result"; // 關注2:option選項 // 關注3:訊息模型 message AppResult { optional string message = 1; required string data = 2; optional string version = 3; optional string mobile = 5; optional int32 code= 6[default = 500]; optional string email = 7; } 複製程式碼
java專案中編寫.proto檔案了.例如: 新建 Demo.proto
package protocobuff_Demo; // 關注1:包名 option java_package = "com.hk.protocolbuffer"; option java_outer_classname = "Demo"; // 關注2:option選項 // 關注3:訊息模型 // 下面詳細說明 // 生成 Person 訊息物件(包含多個欄位,下面詳細說明) message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; } 複製程式碼
-
setup 2
使用mvn clean install 命令 構建,在專案的
arget/generated-sources/protobuf/java
下能找到生成的檔案,收取成果
注意:
- 如果檔案無法被idea 識別,請安裝
Protobuf Support
外掛 comhkprotocolbuffer
目錄是option java_package
指定的包名- .proto語法參照: developers.google.com/protocol-bu…
- 如果檔案無法被idea 識別,請安裝
(三)Java專案中SpringBoot配合 Protobuf 使用
-
setup 1
配置
ProtobufHttpMessageConverter
,其他的基本配SpringBoot都自動配置好了,直接使用就可以了/** * This example demonstrates serving up REST payloads encoded using Google Protocol Buffers. */ @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } @Bean ProtobufHttpMessageConverter protobufHttpMessageConverter() { return new ProtobufHttpMessageConverter(); } } 複製程式碼
-
setup 2
使用舉例
@RestController @RequestMapping("/app") public class ApiRegisterController { @Resource(name = "appUserService") private AppUserService appUserService; @PostMapping("register2") public Demo.Person register2(@RequestBody Result.AppResult appBaseResult) throws Exception { return Demo.Person.newBuilder().addPhone(Demo.Person.PhoneNumber.newBuilder().setNumber(appBaseResult.getData()).build()).setId(1).setName("張三").build(); } } 複製程式碼
由於protobuf
除錯比較頭痛的問題,我在網上找到了一些除錯工具(歡迎補充):
結束
相關文章
第一篇-網路篇:
第二篇-Retrofit原始碼解析
第三篇-Android元件化和快速實現MVP
第三篇-是時候該瞭解一波Protocol Buffers了[Android]
第三篇-是時候該瞭解一波Protocol Buffers了[Java]
更新中….
關於個人
Github:github.com/chengzichen
CSDN : blog.csdn.net/chengzichen…
個人部落格 : chengzichen.github.io/