新媒技术大讲堂-protobuf序列化协议及应用ppt课件

上传人:风*** 文档编号:240775549 上传时间:2024-05-07 格式:PPTX 页数:48 大小:422.06KB
返回 下载 相关 举报
新媒技术大讲堂-protobuf序列化协议及应用ppt课件_第1页
第1页 / 共48页
新媒技术大讲堂-protobuf序列化协议及应用ppt课件_第2页
第2页 / 共48页
新媒技术大讲堂-protobuf序列化协议及应用ppt课件_第3页
第3页 / 共48页
点击查看更多>>
资源描述
Protocol Buffers序列化协议及应用基础业务开发部高磊2010年10月15日ProtocolBuffers序列化协议及应用基础业务开自我介绍基础业务开发部高级技术经理2006年开始参与飞信个人版服务器端的开发负责个人版服务器端的系统架构规划正在进行下一代服务器端平台FAE的设计与开发自我介绍基础业务开发部高级技术经理Protocol BuffersProtocolBuffers是Google开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储、通信协议等方面官方网站http:/ 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;编写.proto描述文件messagePerson用protoc生成访问代码保存为person.proto文件运行protoc-cpp_out=srcperson.proto得到如下文件person.pb.ccperson.pb.h其他语言Java:protocjava_out=srcperson.protoPython:protocpython_out=srcperson.protoC#:使用第三方工具http:/ person;person.set_name(John Doe);person.set_id(1234);person.set_email();fstream output(myfile,ios:out|ios:binary);person.SerializeToOstream(&output);fstream input(myfile,ios:in|ios:binary);Person person;person.ParseFromIstream(&input);cout Name:person.name()endl;cout E-mail:person.email()endl;编写应用代码Personperson;person.se为什么不用XML在序列化结构化的数据时,相比与xml,protobuf有如下优点简洁消息大小只需要xml的1/101/3解析速度快20100倍减少了二义性可以生成更容易在编程中使用的数据访问代码为什么不用XML在序列化结构化的数据时,相比与xml,pro消息体对比XML(82 bytes)1234JohnDProtocol Buffers(31 bytes)0A/Name字段标识13|2(字段类型:2,length-delimited)084A6F686E20446F65/08是字符串长度,后面是JohnDoe10/Id字段标识23|0(字段类型:0,数字)D209/1234通过变长编码得到1A/email字段标识33|2(字段类型:2,length-delimited)106A646F65406578616d706C652E636F6D/10是字符串长度,后面消息体对比XML(82bytes)protobuf解决的问题跨平台,跨语言向下兼容性好,格式升级毫无压力一次定义,多次生成,完全避免手写枯燥乏味且容易出错的解析代码特别方便用于Rpc和消息存储的场合Protocolbuffers现在是Google内部的标准数据定义语言,在Google代码树种,现在有48,162种不同的消息定义在12,183个.proto文件中,用在RPC和数据存储的场合。(引用自http:/ SearchRequest required string query=1;optional int32 page_number=2;default=10;optional int32 result_per_page=3;default=10;定义消息类型确定消息命名messageSearchRequ字段约束required:必须赋值字段,禁止为空optional:可选字段,可以为空,default=默认值,如果一端报文中不包含可选字段,那么可选字段在反序列化的时候会赋为默认值,如果没有确定默认值,则可选字段将会使用类型的默认值,boolean为false,数字类型为0repeated:集合,可以填充零到多个对象,message SearchRequest required string query=1;optional int32 page_number=2;default=10;optional int32 result_per_page=3;default=10;字段约束required:必须赋值字段,禁止为空mess定义更多的类型在同一个.proto文件中可以定义多个message可以用C+风格的/起始的注释message SearchRequest required string query=1;optional int32 page_number=2;/请求的页码 optional int32 result_per_page=3;/每页返回的值message SearchResponse .定义更多的类型在同一个.proto文件中可以定义多个mess运行protoc生成代码当编写好.proto文件后,运行protoc编译器,会生成你选择语言的代码,针对不同的语言有不同的效果C+:编译器会为每个.proto文件生成.h和.cc文件,为每个message生成一个classJava:编译器会为每个message生成一个.java文件Python:有一些小小的不同,python编译器会针对每个message生成一个静态的descriptor,C#:C#目前为非官方支持,可以用生成C#实体类,也可以直接用Attribute描述写成运行protoc生成代码当编写好.proto文件后,运行pr标量类型protoTypeC+TypeJava TypeC#Type()Notesdoubledoubledoubledoublefloatfloatfloatfloatint32int32intint变长编码,对负数效率低,请用sint32int64int64longlong变长编码,对负数效率低,请用sint32uint32uint32intuint变长编码uint64uint64longulong变长编码sint32int32intint变长编码,对负数效率比int32高sint64int64longlong变长编码,对负数效率比int64高标量类型protoTypeC+TypeJavaType标量类型(续)protoTypeC+TypeJava TypeC#Type()Notesfixed32uint32intuint固定4个字节,针对大于228的数据效率高fixed64uint64longulong固定8个字节,针对大于256的数据效率高sfixed32int32intint固定4个字节sfixed64int64longlong固定8个字节boolboolbooleanboolstringstringStringstring字符串需要UTF8或ASC-7编码bytesstringByteStringbyte标量类型(续)protoTypeC+TypeJavaTBase-128 Varints 整数变长编码每个字节使用使用低7位表示数字,除了最后一个字节,其他字节的最高位都设置为1,例如:数字1:00000001数字300:1010110000000010000001001011000000010+0101100100101100256+32+8+4=300Base-128Varints整数变长编码每个字节使用使消息格式一个ProtocolBuffers的消息包含一系列字段,每个字段由一个变长32位整数作为字段头,后面跟随字段体字段头格式(field_number3)|wire_type-field_number:字段序号-wire_type:字段编码类型消息格式一个ProtocolBuffers的消息包含一系列字段编码类型TypeMeaningUsed For0Varintint32,int64,uint32,uint64,sint32,sint64,bool,enum164-bitfixed64,sfixed64,double2Length-delimitedstring,bytes,embedded messages,packed repeated fields3Start groupgroups(deprecated)4End groupgroups(deprecated)532-bitfixed32,sfixed32,float字段编码类型TypeMeaningUsedFor0Vari编码示例1:整数编码a=150时,编码如下08960108:13|09601:101011000000001001011000000010150messageTest1requiredint32a=1;编码示例1:整数编码messageTest1编码示例2:字符串编码b=testing时,编码如下120774657374696e6712:23|207:字符串长度74657374696e67testingmessageTest2requiredstringb=2;编码示例2:字符串编码messageTest2编码示例3:嵌套编码设置c.a=150时,编码如下1a030896011a:33|203:嵌套结构长度089601Test1a=1messageTest3requiredTest1c=3;编码示例3:嵌套编码messageTest3其他编码规范optional的字段不会出现在消息报文中repeated的字段会出现多次(没设置packed=true)的情况下packed=true选项可以针对整数字段进行优化messageTest4repeatedint32d=4;d=3,270,86942;22/tag(fieldnumber4,wiretype2)06/payloadsize(6bytes)03/firstelement(varint3)8E02/secondelement(varint270)9EA705/thirdelement(varint86942)其他编码规范optional的字段不会出现在消息报文中定义枚举类型枚举类型使用变长编码,必须为32位整数message SearchRequest required string query=1;optional int32 page_number=2;optional int32 result_per_page=3 default=10;enum Corpus UNIVERSAL=0;WEB=1;IMAGES=2;LOCAL=3;NEWS=4;PRODUCTS=5;VIDEO=6;optional Corpus corpus=4 default=UNIVERSAL;定义枚举类型枚举类型使用变长编码,必须为32位整数messa引用其他的消息类型可以在消息定义中嵌套其他的消息类型message SearchResponse repeated Result result=1;message Result required string url=1;optional string title=2;repeated string snippets=3;引用其他的消息类型可以在消息定义中嵌套其他的消息类型mess使用import引入其他文件中的定义如果.proto文件定义在许多不同的文件中,可以用import关键字导入其它的定义后使用其它.proto文件中定义的messagetype使用protoc编译的时候,需要添加设置-I/-import_path参数去确定import的目录,如果不指定import目录,默认为调用protoc的当前目录import myproject/other_protos.proto;使用import引入其他文件中的定义如果.proto文件定义嵌套定义可以在message定义内部定义messagetype引用时需要全名,如SearchResponse.Result可以多层嵌套message SearchResponse message Result required string url=1;optional string title=2;repeated string snippets=3;repeated Result result=1;message SomeOtherMessage optional SearchResponse.Result result=1;嵌套定义可以在message定义内部定义messagety升级规范如何保持向下兼容性不改变任何已经存在的字段的序号新增字段应该标记为optional或repeated不再需要的字段可以删除,但建议先加上OBSOLETE_前缀,这样可以保证序号被保留默认值都是反序列化时产生的,但要保证序列化方没有将默认值当成一个有意义的值进行传输字段类型兼容int32,uint32,int64,uint64,bool互相兼容sint32sint64互相兼容,但不兼容其他整形数字在utf-8编码下,string和bytes是兼容的,Fixed32与sfixed32兼容,fixed64与sfixed64兼容升级规范如何保持向下兼容性Agenda快速开始语言及协议规范开发示例性能对比RPC及应用Agenda快速开始演示:C+Demo演示:C+Demo演示:Java Demo演示:JavaDemo演示:C#Demo演示:C#DemoAgenda快速开始语言及协议规范开发示例性能对比RPC及应用Agenda快速开始性能比较使用一个统一的消息体格式评估以下性能指标序列化速度报文大小JavaJavaSerializeXML:JAXBJSON:使用gson库protobuf:标准C#.NetSerialize:PC+Protobuf:性能比较使用一个统一的消息体格式性能评估结果报文大小(Bytes)序列化耗时(ms)反序列化耗时(ms)JavaSerialize16109971037JavaXML414124684001JavaJson31531143717351JavaProtobuf933776422C#.NetSerialize272645733185C#Protobuf933488673C+Protobuf933282297性能评估结果报文大小序列化耗时反序列化耗时JavaSerAgenda快速开始语言及协议规范开发示例性能对比RPC及应用Agenda快速开始远程调用的种类开放协议WebService平台私有协议.NetRemoting.NetWCFJavaRMI其他常用的协议xmloverHttp远程调用的种类开放协议Protocol Buffers对Rpc的支持支持在.proto文件中定义RpcService能够通过protoc生成框架代码通过实现RpcChannel抽象类,完成Rpc在通信层的交互第三方实现http:/ SearchService rpc Search(SearchRequest)returns(SearchResponse);用.proto方式定义远程调用serviceSearchS选择通信层协议对通信层协议的要求有Transaction的处理机制可以传送二进制报文长连接或短连接均可适合的协议HTTPSipcTcp(需要自己添加Transaction管理,连接控制,并发控制等功能)选择通信层协议对通信层协议的要求制定一个简单的Rpc协议(over Http)RequestPOSTrpc.do?service=&method=HTTP/1.1User-Agent:user-agent-valueHost:host-valueContent-Type:binaryContent-Length:lengthResponseHTTP/1.1200Content-Length:length制定一个简单的Rpc协议(overHttp)RequesRpc Framework 的实现包装客户端框架代码异步/同步接口服务方法的封装协议层的管理异常处理包装服务器端实现代码实现服务代码的框架服务器端协议栈服务的分发及应用线程的管理异常处理,日志处理RpcFramework的实现包装客户端框架代码Rpc Framework:其他的考虑日志调用监控通信层协议的优化应用线程池的保护路由策略RpcFramework:其他的考虑日志个人版服务器端远程调用的发展V2SipcRemotingV3XmloverSipcRemotingV4protobufoverSipcprotobufoverHttpprotobufoverNamedpipeprotobufoverTcp(完善中)个人版服务器端远程调用的发展V2谢谢Questions?谢谢Questions?
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!