集成libevent,google protobuf的RPC框架

标签: libevent google protobuf | 发表时间:2010-06-20 16:30 | 作者:那谁 goodman
出处:http://www.cppblog.com/converse/
RPC(Remote Procedure Call),中文翻译是远程过程调用,其实从原理来说这并不是一个新的概念.我的理解是, 不同的机器之间定义了一些接口, 也有客户端和服务器端,客户端可以通过协商好的接口调用服务器端已经注册好的服务.说白了,还是网络通信的那一套机制.既然还是网络通信,那么为什么需要使用RPC而不是自己去完成这样的一套工作呢?假如是自己做这样的事情,需要考虑编解码,网络层,尤其很多细节需要去关注:协议有哪些?如何定义格式?涉及到整数的还要考虑网络和主机字节序等,如果逻辑程序员还需要关注这些细节,显然太繁琐了.还有就是,国内的公司开发很少有文档,假如查找问题时还需要通过读代码才能知道协议中各个字段的含义,这样对项目的可维护性会有很大的影响.假如使用了RPC,通过RPC工具定义的格式来定义协议,可以一目了然.而且,网络层就应该只关注网络层的工作,逻辑层架构在网络层之上再完成逻辑的操作.把网络和逻辑分开,也是清晰的架构设计.

google protobuf 是google公开的一套用于网络通信时用于协议编解码的工具库,使用它定义的格式,你可以定义协议的字段,由它自带的编译器生成出负责编解码的代码文件(可生成许多不同的语言文件).同时,它还包括了基本的RPC接口定义.但是,这个工具用在RPC上比较大的问题是它只负责生成代码文件,而如果要真正使用起来做为一个RPC框架,还需要对它进行网络层上的封装,但是在它自己的官方文档上并没有给出一个demo告诉读者如何一步一步的来完成这样一个工作.thrift是与google protobuf同样定位的一个工具库,除了具备google protobuf相同的功能外,如支持多语言,跨平台,高效的编解码,还集成了网络通信层,可以使用它完成所有RPC所需要完成的工作.在这个页面中,google protobuf给出了一些已知的使用不同语言对它进行封装的项目.

chenshuoevproto同样也是集成libevent与google protobuf的RPC框架,不过在对libevent的使用上,这里的做法与他不尽相同:
1) 他使用了libevent自带的RPC功能, 而这里只使用到libevent对网络I/O进行的封装的最基本的功能.
2) 之所以有1)的考虑,是因为我认为一个工具最好应该是"do one thing, do it better"的(也许从这点可以解释为什么google protobuf没有像thrift那样自带网络层,而是把这个工作留给了用户),libevent已经越来越大,除了对I/O,信号,定时器等的封装之外,现在还有RPC,异步DNS,http协议的支持等等,说真的,如果只是关注到网络I/O的多路复用机制,那么几乎任何一个熟练的程序员都可以很快的自己做出这样的一套东西来,使用libevent无非就是为今后可能的跨平台做准备罢了.随着我对libevent发展方向的不认同,还曾经想过使用libev替代libevent,不过现在暂时不想折腾这个事情了.

eventrpc项目目前是avidya下的一个子项目,avidya项目的定位是实现一些分布式的玩具系统(比如google已经公开论文的chubby,mapreduce,GFS等),也许以后不一定能被用上,但是也要实践做一把.由于有一个好用的RPC框架是做分布式的必需品,所有首先实现eventrpc这个子项目了,以后也许还会实现其他语言的版本,如python,java.

eventrpc的网络模型上,使用以前提到的memcached的网络模型, 主线程负责接收新的连接, 再将这些新的连接交由副线程处理,每个副线程自带I/O dispatcher.在samples目录下,有一个实现了echo服务的客户端和服务器端示例.

在使用之前,请确保libevent和google protobuf已经安装成功,当前只在linux下可用.



那谁 2010-06-20 16:30 发表评论

相关 [libevent google protobuf] 推荐:

集成libevent,google protobuf的RPC框架

- goodman - C++博客-那谁的技术博客
chenshuo的evproto同样也是集成libevent与google protobuf的RPC框架,不过在对libevent的使用上,这里的做法与他不尽相同:. 1) 他使用了libevent自带的RPC功能, 而这里只使用到libevent对网络I/O进行的封装的最基本的功能.. eventrpc项目目前是avidya下的一个子项目,avidya项目的定位是实现一些分布式的玩具系统(比如google已经公开论文的chubby,mapreduce,GFS等),也许以后不一定能被用上,但是也要实践做一把.由于有一个好用的RPC框架是做分布式的必需品,所有首先实现eventrpc这个子项目了,以后也许还会实现其他语言的版本,如python,java..

jprotobuf 1.0.3发布,简化java程序员对google protobuf的应用

- - 开源软件 - ITeye博客
jprotobuf是针对Java程序开发一套简易类库,目的是简化java语言对protobuf类库的使用. 使用jprotobuf可以无需再去了解.proto文件操作与语法,直接使用java注解定义字段类型即可. JProtobuf官方网址: https://github.com/jhunters/jprotobuf .

Google 发布 Eclipse 编辑器的协议缓冲器插件 Protobuf-dt

- tinda - ITeye资讯频道
Protobuf-dt是Google针对Eclipse编辑器开发的协议缓冲器插件,提供所有IDE编辑器所具备的功能,包括语法高亮、大纲视图、内容协助和超链接. Protobuf-dt还可提供跟协议缓冲器有关的功能,包括自动生成数字标签、Java式的文档和protoc整合. Google员工之前已经在多个内部工程里测试并使用了Protobuf-dt,所以你大可放心.

一种自动反射消息类型的 Google Protobuf 网络传输方案

- absolute - 博客园-陈硕的 Blog
陈硕 (giantchen_AT_gmail). 这篇文章要解决的问题是:在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做的反序列化. “自动”的意思是:当程序中新增一个 protobuf Message 类型时,这部分代码不需要修改,不需要自己去注册消息类型.

[转]使用 libevent 和 libev 提高网络应用性能

- Sonic - heiyeluren的blog(黑夜路人的开源世界)
Brown, 作家, Freelance. 许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接. 无论是通过构建基于云的服务来处理网络通信流,还是把应用程序分布在 IBM Amazon EC 实例上,还是为网站提供高性能组件,都需要能够处理大量并发连接. 一个好例子是,web 应用程序最近越来越动态了,尤其是使用 AJAX 技术的应用程序.

protobuf,json,xml,binary,Thrift之间的对比

- - 学习笔记
一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的. protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,详情访问protobuf的google官方网站 https://code.google.com/p/protobuf/.

通过netty提供Protobuf服务

- - ITeye博客
1、下载安装Protocol Buffer.     >下载地址: http://code.google.com/p/protobuf/.     >需要下载文件:protobuf-2.5.0.tar.gz(也可以直接下载protobuf-java-2.5.0.jar;这里通过maven生成);protoc-2.5.0-win32.zip(windows平台需要).

让protobuf生成器支持时间戳检查

- Ease - C++博客-首页原创精华区
使用protobuf的生成器可以对proto文件进行解析后生成指定的目标语言代码.随着项目的不断扩大, 协议修改变的非常频繁, 因此每次重编变的异常耗时. 模仿C/C++编译器的时间戳检查生成机制,我给protobuf生成器添加了时间戳检查功能. 此功能不是必须的, 可以通过命令行指定—timestampfile FILE 来指定要生成的proto文件对应的时间戳.

zmq-rpc:基于zeromq网络层编写的protobuf RPC框架

- Shengbin - codedump
阅读过zmq的代码之后,感觉这个网络层是我目前见过最高效的–线程之间使用lockfree的消息队列保存消息,可以启动多个I/O线程分担压力等等特性.于是决定基于它写一个protobuf RPC的框架.. 另外,这里使用的protobuf是旧版本2.3.0,新版本2.4.1的生成的RPC service接口跟原来不太一致,暂时还没有去研究它.BTW,升级版本之后导致原来的接口发生变化这是一个很操蛋的事情..