是時候該瞭解一波Protocol Buffers了[Java]

chengzichen發表於2019-03-04

前言

Protocol Buffers,是Google公司開發的一種資料描述語言,類似於XML能夠將結構化資料序列化,可用於資料儲存、通訊協議等方面。

它不依賴於語言和平臺並且可擴充套件性極強。現階段官方支援C++JAVAPython三種程式語言,但可以找到大量的幾乎涵蓋所有語言的第三方擴充包。

google在2008年7月7號將其作為開源專案對外公佈

雖然Protocol Buffers很早就被開源出來,被使用的頻率並沒有JsonXML多,大多數被用於遊戲開發協議,RPC和即時通訊.然而這樣的資料交換利器比JsonXML的利處多太多了,但更小更快更簡單

該文章是繼是時候該瞭解一波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-utilprotobuf相關的工具類

    • 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…

(三)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/

本人一直都致力於Android元件化和外掛化的研究如果大家有更好的想法可以聯絡我一起成長
圖片名稱

相關文章