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

前言

Protocol Buffers,是Google公司開發的一種數據描述語言,相似於XML可以將結構化數據序列化,可用於數據存儲、通訊協議等方面。html

它不依賴於語言和平臺而且可擴展性極強。現階段官方支持C++JAVAPython三種編程語言,但能夠找到大量的幾乎涵蓋全部語言的第三方拓展包。java

google在2008年7月7號將其做爲開源項目對外公佈git

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

該文章是繼是時候該瞭解一波Protocol Buffers了[Android]後的Java後臺SpringBoot快速集成Protocol Buffers編程

SpringBoot中快速使用Protocol Buffers

(一)SpringBoot 環境下Maven配置 Protocol Buffers編譯環境

  • setup 1網絡

    配置 protobuf,protobuf-java-util,protobuf-java-format依賴app

    <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>
    複製代碼

    注意:maven

    • protobuf-java-utilprotobuf相關的工具類編程語言

    • protobuf-java-format 是能夠將protobuf轉換爲Json格式轉換器ide

    • 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插件
    • com\hk\protocolbuffer 目錄是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組件化和插件化的研究若是你們有更好的想法能夠聯繫我一塊兒成長
圖片名稱
相關文章
相關標籤/搜索