Google Protocol Buff

发布时间:2019-09-09 08:51:11编辑:auto阅读(3551)


    一、参考资料


    跨语言通信方案的比较—Thrift、Protobuf和Avro

    Google Protobuf 3版本介绍

    Google Protocol Buffer 简单介绍

    python+protobuf 在python中使用protocol buffer

    Protobuf3语言指南

    Protobuf协议的Java应用例子



    二、Protobuff安装







    下载到本地



    解压后重命名文件夹如下【也可以保持原有的文件夹名不动】






    三、protoc.exe编译器下载


    百度网盘:protoc-3.5.1-win32.zip

    下载解压后,将文件夹bin下面的exe执行程序拷贝到上一步的protobuff目录任意文件夹下




    比如放在src目录下





    配置系统环境变量 【Path】





    启动CMD,输入protoc,验证配置是否成功





    我们可以看到编译器的一些参数,其支持输出的语言类型包括C++,C#,Python,Java等






    四、简单proto文件编写


    Protocol Buffers是一个更灵活、高效、自动化的解决方案。它通过一个.proto文件描述我们想要的数据结构


    比如:





    syntax = "proto3";
    message Person {  
      int32  id    = 1 ;  //message体内的字段序号从1开始往下排  
      string name  = 2 ;  
    } 



    上述定义了一个消息体,名称是Person,编译后等同于Python的模块、Java的类、C++的头和源文件,其中有两个字段,一个是32位的id,一个是字符串name


    关于proto的字段类型有哪些,可以参考:Protocol Buffer 语法(syntax)




    五、Windows下,Python配置probuff环境



    切换到最开始我们下载的protocol的目录下,找到python文件夹,进去,依次执行


    python setup.py build
    
    python setup.py test
    
    python setup.py install



    执行前目录结构:





    执行后:






    六、Python使用Protobuf



    将person.proto文件放到任意目录下,最好是python的工作目录下,比如我的放在D盘的proto目录下





    有了proto文件,我们需要用protoc.exe工具将其编译成Python语言可以识别的Person模块【py】


    编译命令:  protoc -I=输入目录 --python_out=python模块的输出目录 空格 proto文件的绝对路径


    打开CMD窗口,由于protoc.exe的环境变量已配置,所以比着上面的模子在窗口中写:


    protoc -I=D:/proto --python_out=D:/proto D:/proto/person.proto




    不报错就OK,随后,我们可以看到同目录下多了一个文件出来





    别小看person.proto这个文件,这个文件可是跨语言的二进制协议文件,也就是我们只需要定义通信的message体,即可实现C++、Java、Python、JS、PHP等语言平台之间的通信,而且这种传输效率很高,后续我会针对Python和Java这两种语言实现基于这种传输协议的Web Restful接口的调用


    话不多说,我们在当前目录下,新建一个demo模块,并引入模块person_pb2.py如下





    随后我们可以从这个模块中拿出一个person的对象,并很嗨皮的给其附上对应的属性值,如下






    我们看一下person_pb2.py这个模块中的属性字段怎么定义的






    最后,我们执行下,打印一下person这个对象的信息如下






关键字