Google Protobuf使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Linjingke32/article/details/82655861

        Protobuf,全称Protocol Buffers,由Google公司开发出来且其内部广泛使用,对比其它的编解码框架,有如下几个优点:

        1. 跨语言支持,如Java、C++、Python等

        2. 编码后消息更小,因此,更有利于网络传输和本地存储,当然,性能也很强大

        3. 不同版本协议的数据结构前向兼容

       Protobuf依据".proto"文件来生成各种语言代码,在Windows电脑可能要另外安装,而类Linux系统应该都默认安装了,我使用的Mac电脑已经安装了:

        

        这里基于Java来使用,构建工具使用maven,首先在pom.xml增加对protobuf的依赖:

        

        以及maven的protobuf插件:

        

<build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.5.0.Final</version>
            </extension>
        </extensions>

        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.1</version>
                <!-- https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html -->
                <configuration>
                    <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                    <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
                    <clearOutputDirectory>true</clearOutputDirectory>
                    <pluginId>grpc-java</pluginId>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

       新建目录:

       - src/main/proto

        

        安装IDEA插件,以便高亮语法:

        

       这里做一个简单的登录请求接口,客户端发送账号密码到服务端,服务端验证后返回消息,因此,编写请求实体类的proto描述文件如下:

         新建proto接口文件:

         

         生成目标类文件:

         

         点击其中的protobuf:compile即可,但发生如下错误:

         

          因为Mac电脑默认装的是2.6.1版本,这里手动升级,在GitHub下载3.6.1的的OS X的编译好的可执行文件,配置环境变量即可(注意,默认IDE从/usr/local/bin目录下去找protoc可执行文件,这里ln -s做一个软链接过去即可):

         

         重新,生成即可看到:

                    下面测试下序列化:

          我们可以使用JSON来将对象序列化传输,但是性能肯定比不上protobuf,这里序列化后输出如下:

          

           反序列化,就是把这串bytearray转成对象:

           

try {
            System.out.println(ModelAccount.Account.parseFrom(account.toByteArray()).toString());
        }
        catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

        基本使用就到这,更多扩展可以参考官方文档。protobuf在数据交换存储效率上较xml或json具有更高的效率,因此,在多个微服务的数据通信中可以借助它,对外,可以提供http数据形式的接口,但是,各个微服务内部,基于gRPC的远程过程调用,它底层使用protobuf来做数据交换,这样可以提供系统的性能。

猜你喜欢

转载自blog.csdn.net/Linjingke32/article/details/82655861