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

protobuf-rpc-pro

不知道你还记不记得 protobuf-rpc,这货在后面加了个 pro,就真的重量级了许多。照例先看看简介:A java ProtocolBuffers RPC implementation featuring bidirectional calls,特点是双向调用,跟之前的看的 rpc 都不一样。姑且按下不表,单来看看基本格式文件,http://code.google.com/p/protobuf-rpc-pro/source/browse/trunk/protobuf-streamer-pro/src/main/protos/protobuf-stream.proto ,全文如下:

// // TcpClient->TcpServer : PullRequest // TcpClient->TcpServer : PushRequest // TcpServer->TcpClient : Chunk // TcpClient->TcpServer : CloseNotification ( for closing pulls before transfer end. ) // TcpServer->TcpClient : CloseNotification ( for closing pushes before transfer end. ) // option java_package = "com.googlecode.protobuf.pro.stream.wire"; option java_outer_classname = "StreamProtocol"; // This is default, but it's nice to be explicit option optimize_for = SPEED; message PullRequest { required int32 correlationId = 1; required bytes requestProto = 2; } message PushRequest { required int32 correlationId = 1; required bytes requestProto = 2; } message CloseNotification { required int32 correlationId = 1; } message Parameter { required string name = 1; required string value= 2; } message Chunk { required int32 correlationId = 1; // unique for each push/pull per channel required ChunkTypeCode chunkType = 2; required int32 seqNo = 3; // incremented for each sent chunk repeated Parameter parameter = 4; optional bytes payload = 5; } enum ChunkTypeCode { START = 0; MIDDLE = 1; END = 2; } message WirePayload { optional Chunk chunk = 1; optional PullRequest pull = 2; optional PushRequest push = 3; optional CloseNotification close = 4; }

哇,好长好长,一定是场硬仗。Protobuf-rpc-pro 的特点就是双向调用,所以有 pull 和 push 两种 request message,让人纠结的是,其实他们是一样的,简单地采用 32 位 ID 加序列化后的 message 方案。响应包叫做 Chunk,独特的地方是一个响应包,可以分在若干个 Chunk 中发送到另一端,这样的话如果返回的结果很大,也算是有内置的解决方案了。带了一个 pro 的东西,就是比较重量级啊。这个特性是通过 chunkType 和 seqNo 两个字段共同来完成的,chunkType 用以标识起始点,而 seqNo 用来组织顺序。repeated Parameter parameter 的作用是传递一些扩展的参数,这些参数可能在处理 payload 的时候用得着,而这个 payload 是序列化的 message,它才是调用返回的结果(或结果的一部分)。
最后来看一下 WirePayload,现在来看,这货就简单了,跟 protobuf-rpc 中的 message Rpc 或 protobuf-remote 中的 message RpcMessage 是一样的封装类,见得多了也就没什么好说。
看来带 pro 的设计的确是考虑得比较周全,刚才还有一个 message CloseNotification 一直压着没谈,现在来说一下:它用来告知另一端自己马上就要关闭服务了。关于这一点,我觉得利用 TCP 本身的是半关闭特性就够了,没有必要做这个。

server1

server1 出自国人之手,是一个利用了 Boost 的 a c++ network server/client framework,它的作者 xiliu tang 是我的前同事。server1 的代码还是非常简明的,先来看一下基础格式:http://code.google.com/p/server1/source/browse/trunk/server/meta.proto ,全文如下:
package ProtobufLineFormat; message MetaData { enum Type { REQUEST = 1; RESPONSE = 2; }; required Type type = 1; required uint64 identify = 2; // the request should bring the response identify. optional uint64 response_identify = 3; required bytes content = 4; };
很简单,只有一个 message MetaData?对的。感觉上跟 protobuf-rpc 差不多,两个不同:一是 MetaData 带了一个 Type,用来标明它是请求还是响应;还有一个是 MetaData 使用了无符号 64 位整型作为 ID。使用 type 字段我个人感觉比 repeated/optional 的方式比起来有点没有充分利用到 protobuf 特性的感觉,不过相当地清晰明了。还有就是 response_identify 我专门在 GTalk 上问过作者,他说记不起为什么要加这个字段了……囧。我的看法是这个字段是不必要的。嗯,这个设计真的很简洁,不过,我不喜欢 Meta 这个命名。
===== 未完待续 =====

以小见大——那些基于 protobuf 的五花八门的 RPC(4)相关推荐

  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(3)

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

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

    赖勇浩(http://laiyonghao.com ) Google protobuf(http://code.google.com/p/protobuf)提供了 service 关键字来描述 RPC ...

  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. python科学计算基础教程pdf下载-Python科学计算基础教程_PDF电子书
  2. Spring MVC的优势
  3. [渝粤教育] 西南科技大学 电子商务原理及应用 在线考试复习资料
  4. 20145302张薇 《信息安全系统设计基础》第14周学习总结
  5. hibernate.hbm.xml必须必须配置主键
  6. ACE主动对象模式(1)
  7. 奇妙的等式 精妙的证明
  8. 半圆形进度条(vue加强版)
  9. 服务器2003设置共享文件夹共享文件夹,WinServer2003 文件夹共享 方法设置
  10. 高效沟通的5个原则,解决90%的沟通问题
  11. 两道非常容易理解错的OSPF问题. 加深理解LSA的概念和ABR/ASBR的概念.
  12. 让我摘下星星送给你_摘下星星送给你摘下月亮送给你是哪首歌的歌词
  13. html字体如何运用在ps上,PS新手怎么运用好工作中文本工具
  14. Mac OSX中设置路由
  15. 【个推CTO谈数据智能】之数据安全计算体系
  16. android 多人视频,Android QQ 5.0 正式版:全新界面、精彩动态、多人视频/音频
  17. Elixir服务器接收客户端消息01
  18. 芋道项目搭建注意事项
  19. 盘点国内5大Java开源网店系统
  20. excel 根据起始日期计算到期日

热门文章

  1. 【重磅】阿里巴巴创新中心一周内迎两位省委书记视察指导
  2. java缓存内存泄漏_记一次mybaits缓存导致的内存溢出 java.lang.OutOfMemoryError: Java heap space...
  3. 轻松解决外出旅游免费wifi上网问题
  4. xhprof php5.5,Thinkphp5中配置XHProf性能分析工具
  5. Apache Dubbo框架解析
  6. Hybrid的配置(一)
  7. 2022社交电商模式怎么裂变营销?—分享购
  8. Go语言-Go interface 接口的最佳实践
  9. Python打乱pandas的数据
  10. Android防蹭网大师1.3.3.125绿色优化精简版