`
javayestome
  • 浏览: 1071482 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

以小见大——那些基于 protobuf 的五花八门的 RPC(1)

阅读更多

赖勇浩(http://laiyonghao.com

<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->

Google protobuf(http://code.google.com/p/protobuf)提供了 service 关键字来描述 RPC,但没有实现,所以大家都纷纷自制 RPC,仅仅是在 protobuf 官网列出来的,就有十几个(http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns#RPC_Implementations)。它们使用不同的语言、框架的大不同就不用多说了,没想到的是我看了几个之后,发现即使是每个调用的请求和响应包格式都大有不同哦,体现了蛮多不同理念。有兴趣的不妨先跟我一起浏览一下其中比较有特点的七八个实现,然后我们再画个表来总结总结。

protobuf-rpc

它的自我简介是 RPC based on Google's protocol buffers。基本的包格式见:http://code.google.com/p/protobuf-rpc/source/browse/trunk/protocol/protobufrpc.proto,全文如下:

不知道大家有没有注意到 message Rpc 里的两个字段都是 repeated 的!我设想,这个设计的有以下特点:同一个数据包里可以有多个 request 或 response,甚至是返回 response 的同时丢若干 request 回去给另一端,相当地灵活。
再来看 Request.method,注释是 name of a method_descriptor,实际上是 service_descriptor 的 name 加上 method_descriptor 的 name 来的,不过如果你不看代码无法知道这一点(代码见:http://code.google.com/p/protobuf-rpc/source/browse/trunk/python/protobufrpc/synchronous.py#60);这样做的好处是你可以在同一个端口 host 若干个 service。但是这跟不上变化的注释和隐晦的字段名,真的让人很纠结,破代码的典范。
id 字段居然是 optional 的,让我有点迷惑,特别是看到 Response.id 居然是 required,额……天哪,Request 不是自带 id 的话拿什么东西来设置 Response 哦!事实上,从代码来看,Request.id 都是有设置的,读的时候也是当这个字段是 required 来处理。
Error 的设计中规中矩,不过 code 就没有先用 enum 包装一下,预设几种常见错误,有点过于自由化了。
最后,因为看到 Request.serialized_request 和 Response.serialized_response 都是 optional,我惊了一下,以为 protobuf 的 RPC 可以没参数和返回值的,但又想起从来没见文档提到过。最后还是小马过河,自己写了一个没有参数的 RPC 去编译,protoc 老实不客气地丢出来一句“Expected type name.”,确认了 RPC 都需要参数和返回值。所以这个Request.serialized_request 的 optional 应该改用 required;而 Response.serialized_response 则可以是 optional,因为当 RPC 执行错误的时候,无法返回 Response 实例,只能返回 Error 实例,所以需要 optional 来满足这个灵活性。作者这货真不严谨。
未完待续……

分享到:
评论

相关推荐

    protobuf-rpc-pro

    protobuf-rpc-pro是一个基于Java实现的Protocol Buffers(protobuf)的RPC框架,它支持双向通信功能,即客户端和服务器之间可以同时发起调用。RPC(Remote Procedure Call)是一种分布式计算技术,允许程序在不同的...

    PHP调用protobuf的rpc接口示例和说明

    在上述代码中,`ExampleServiceClient`是protobuf编译器生成的客户端类,`Call`方法对应.proto文件中的RPC服务方法。`Grpc\ChannelCredentials`用于建立安全的连接。 5. **运行和测试**:启动服务端,然后运行PHP...

    protobuf-rpc:protobuf-rpc 是一个基于 Google ProtocolBuffer 的 RPC 框架。 目前 protobuf-rpc 支持 Cocoa Objective-C 和 Java 的服务和消息定义和代码生成

    protobuf-rpc是一个基于的远程方法调用(RPC))实现,服务器端当前仅支持Java(JDK 1.7及以上),客户端支持Objective-C(cocoa/iOS)和Java(J2SE/Android)。 Why protobuf-rpc? 对于纯的基于Windows或者Linux的服务器来...

    基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip

    基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现...

    protobuf rpc

    protobuf RPC是一种基于Google开源的Protocol Buffers(protobuf)序列化协议实现的远程过程调用(RPC)框架。protobuf是Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够读写这些数据的...

    python如何通过protobuf实现rpc

    ### Python通过Protobuf实现RPC的方法 #### 一、RPC简介及Protobuf的作用 **远程过程调用(RPC)**是一种协议,允许程序调用另一个地址空间(通常是在另一台计算机上运行的不同操作系统)上的程序,无需程序员显式地...

    Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现.zip

    总结,Protobuf RPC是一种高效的RPC通信方式,它利用protobuf进行数据序列化,基于TCP协议保证传输的可靠性。在Java中实现Protobuf RPC涉及服务接口定义、客户端和服务端的实现、TCP连接管理等多个方面,适合于对...

    Android中基于protobuf的socket通信的实例

    本实例将深入探讨如何在Android应用中使用protobuf进行基于socket的通信。 首先,理解protobuf的基本原理是至关重要的。protobuf通过定义.proto文件来描述数据结构,然后使用protoc编译器生成对应语言的类文件。在...

    protobuf-rpc-echo:一个简单的rpc echo演示,使用python和protobuf

    protobuf-rpc-echo是一个基于Python和Google的Protocol Buffers(protobuf)实现的简单RPC(Remote Procedure Call)回声服务示例。在这个项目中,protobuf被用作数据序列化工具,而RPC机制则允许客户端和服务器之间...

    protobuf-rpc-js:基于协议缓冲区的轻量级RPC for JS

    ProtoBuf.Rpc.js:使用协议缓冲区JavaScript轻量级RPC JavaScript( JS )库允许使用Google的创建消息,该消息除了可以指定消息外,还可以指定远程过程调用( RPC )服务:但是,开发人员有责任提出实际的请求。 ...

    基于protobuf反射特性的pb、json相互转换的实例程序(C++)

    本资源提供了一个基于protobuf反射特性的pb结构与json相互转换的实例,该实例程序主要有两个核心函数myMessage2Json、myJson2Message。前者的作用是将pb结构转换成对应的json,后者是将json转换成对应的pb结构体。...

    基于protobuf-net的C# Protobuf 插件.zip

    1. **什么是Protocol Buffers(Protobuf)**: - Protobuf是一种序列化协议,由Google开发,用于结构化数据的编码和解码,它比XML更小、更快且更简单。 - 它定义了一种语言无关、平台无关的格式,可以将复杂的结构...

    Netty4+ProtoBuf通信框架

    在这个项目中,客户端和服务端之间的通信是基于ProtoBuf协议进行的,通过maven项目管理依赖,提供startClient和startServer两个主要的入口类。 Netty是一个用Java编写的异步事件驱动的网络应用框架,特别适合用于...

    protobuf-js-3.17.0

    protobuf-js-3.17.0 是一个针对JavaScript环境实现的Protocol Buffers库,它提供了稳定性和兼容性,尤其在3.17.0版本中,开发者可以期待更可靠的性能和功能。Protocol Buffers(简称protobuf)是Google推出的一种...

    Unity3D 与 Java 基于 Protobuf 通信实现(客户端)

    int32 id = 1; string name = 2; float score = 3; } ``` 这个.proto文件定义了一个PlayerInfo消息类型,包含了玩家的ID、名字和分数。使用protobuf-net工具,这个.proto文件会被转换为C#类,可以方便地在Unity...

    (源码)基于Protobuf的数据序列化代码生成工具.zip

    # 基于Protobuf的数据序列化代码生成工具 ## 项目简介 本项目是一个基于Protocol Buffers(Protobuf)的代码生成工具,旨在帮助开发者快速生成JavaScript和TypeScript代码,以便在不同编程语言中实现高效的数据...

    Python调用序列化数据工具Protocol Buffers——protobuf

    1. **安装protobuf**: 可通过pip在Python环境中安装protobuf库: ``` pip install protobuf ``` 2. **编写.proto文件**: 创建一个`.proto`文件,例如`person.proto`,定义消息类型: ```protobuf syntax = ...

Global site tag (gtag.js) - Google Analytics