赖勇浩(http://laiyonghao.com )

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 request = 1; repeated Response response = 2; } message Request { required string method = 1;   // name of a method_descriptor optional bytes serialized_request = 2; // pb2-encoded message optional uint32 id = 3; } message Error { required sint32 code = 1; optional string text = 2; } message Response { optional bytes serialized_response = 1; // pb2-encoded message optional Error error = 2; required uint32 id = 3; }
不知道大家有没有注意到 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(1)相关推荐

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

    赖勇浩(http://laiyonghao.com) 快刀斩乱麻,祭上最后两个 rpc 分析,再整上我自己的设计,这个系列就完结了. protobuf-socket-rpc 好,废话不多说,看看这个 ...

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

    赖勇浩(http://laiyonghao.com ) 多看了三五个 rpc 实现之后,这个事儿就变得很有趣了,今儿来看 fepss-rpc 和 casocklib,分别基于 java 和 C++ 开 ...

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

    赖勇浩(http://laiyonghao.com ) protobuf-rpc-pro 不知道你还记不记得 protobuf-rpc,这货在后面加了个 pro,就真的重量级了许多.照例先看看简介:A ...

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

    赖勇浩(http://laiyonghao.com ) protobuf-remote 嘎~再来一枚 C++ 系的 RPC,它的简介是 RPC implementation for C# and C+ ...

  5. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架--Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

  6. netty 基于 protobuf 协议 实现 websocket 版本的简易客服系统

    https://segmentfault.com/a/1190000017464313 netty 基于 protobuf 协议 实现 websocket 版本的简易客服系统 结构 netty 作为服 ...

  7. 基于Protobuf的通讯库--Poppy简介

    引言: 2011年12月,基础架构部总经理暨搜索业务线首席架构师朱会灿以<云计算平台的构架,设计和实现>为主题为大家做了一次技术讲座,对我们的"台风"云计算平台做了介绍 ...

  8. 基于Protobuf共享字段的分包和透传零拷贝技术,你了解吗?

    导语 | 本文通过介绍实现Protobuf共享字段Guard,并将其应用于中控/召回场景,并获得了显著CPU/时延收益.即使不使用Guard,希望本文的经验和思路也能为读者带来一些帮助和参考. 引言 ...

  9. 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构

    前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...

最新文章

  1. 《深入理解java虚拟机》
  2. openresty开发系列27--openresty中封装redis操作
  3. C#的foreach
  4. BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
  5. (五十六)iOS多线程之NSOperation
  6. linux中nslookup命令功能,nslookup
  7. Linux下调用fork或system启动子进程的信号和资源释放相关问题
  8. 办公室同事全是女性是一种什么体验?
  9. 3dmax shift用来复制对象
  10. 计算机过程控制系统李向舜pdf,2010-2011学年一学期(16-19周)考试安排表(1)
  11. oracle考试试题及其答案,oracle考试试题及答案
  12. java给链表赋值_Java链表操作代码
  13. Astah Pro 快捷键
  14. Dreamweaver——滚动字幕制作方法总结
  15. 2017.08.18【NOIP提高组】模拟赛B组 沙耶的玩偶(doll)
  16. java输入无名粉_05·无名粉店(上)
  17. UE5 live-coding和build中version“1.2“ not support build failed解决方法
  18. 【论文研读】-用于约束多目标优化的新型双阶段双种群进化算法
  19. OpenCV图像的基本操作
  20. 如何做好笔记以及记好笔记的好处

热门文章

  1. NBUT 1457 B - Sona
  2. MindCV提交ISSUE规范
  3. Android 加载长图片(类似微博长图)
  4. 北斗4G遥测终端 北斗4G双模通信遥测终端机
  5. 找回浏览器记住的密码
  6. Unity使用Json解析时报错[JsonException: Invalid character '' in input string]
  7. ijkplayer项目
  8. Android IjkPlayer API介绍
  9. Layui表格工具栏绑定事件失效问题
  10. OJ 1220 勒让德多项式的值