参考 http://blog.csdn.net/pi9nc/article/details/17336663

集成libevent,google protobuf的RPC框架

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下可用.

RPC的学习 & gprotobuf 和 thrift的比较的更多相关文章

  1. 微软RPC技术学习小结

    RPC,即Remote Procedure Call,远程过程调用,是进程间通信(IPC, Inter Process Communication)技术的一种.由于这项技术在自己所在项目(Window ...

  2. RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

    本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...

  3. Thrift RPC实战(一).初次体验Thrift

    1.前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码,主要特点: 开发速度快: 通过编写RPC接口ID ...

  4. 简易RPC框架-学习使用

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. RPC原理与实践(二)----Thrift分层模型

    这一节我们从一下几个方面来讲一下Thrift的分层架构,按照官方的定义这是Thrift的网络栈,其中网络栈中分为一下几个部分,(由栈顶到栈底)server,processor,protocol,tra ...

  6. RPC原理与实践(一)----RPC原理与实现(Thrift版)

    什么是RPC?为什么要使用RPC? 首先什么是RPC,RPC全称Remote Process Call,远程过程调用,现在几乎所有的公司都在使用RPC这种架构,诸如YOUTUBE使用的Thrift,B ...

  7. RPC服务框架探索之Thrift

    前言架构服务化后,需要实现一套方便调用各服务的框架,现在开源如日中天,优先会寻找开源实现,如果没有合适自家公司业务的,才会考虑从零开发,尤其是一切以KPI为准绳的公司,谁会跟钱过不去?N个月之前,公司 ...

  8. RPC简易学习

    0.RPC简介 RPC,   英文全称:Remote Process Call.   中文全称:远程过程调用. 客户端通过网络请求调用远程服务端对外暴露服务.常用的两种RPC协议:TCP.HTTP. ...

  9. RPC框架学习+小Demo实例

    一.什么是RPC协议? 全称:远程过程调度协议 效果:使消费者向调用本地方法一样调用远程服务方法,对使用者透明 目前常用:Dubbo.Thirft.Sofa.... 功能: 建立远程通信(socket ...

随机推荐

  1. popupwindow显示的位置 布局的右上角,标题栏下

    View popview = View.inflate(activity, R.layout.popwindow_layout, null); int width = Dp2pxUtils.Dp2Px ...

  2. poj1222 EXTENDED LIGHTS OUT

    设输入矩阵为A,输出矩阵为B,目标矩阵为C(零矩阵). 方便起见,矩阵行列下标均从1开始. 考虑A矩阵元素a(i,j),B矩阵中与其相邻的元素 b(i,j),b(i - 1, j),b(i + 1,j ...

  3. C++的几种强制类型转换

    有时我们希望显式地将对象强制类型转换成另外一种类型.例如,如果想在下面的代码中执行浮点数除法: int i, j; double slope = i / j; 就要使用某种方法将i和/或j显式地转换成 ...

  4. JAVA基础知识之多线程——线程的生命周期(状态)

    线程有五个状态,分别是新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead). 新建和就绪 程序使用new会新建一个线程,new出的对象跟普通对象一 ...

  5. Java fundamentals of basic IO

    IO is a problem difficult to handle in various of systems because it  always becomes a bottleneck in ...

  6. readDouble

    readDouble是从一个文件中读取double类型的数据

  7. 2016年12月3日 星期六 --出埃及记 Exodus 20:24

    2016年12月3日 星期六 --出埃及记 Exodus 20:24 "`Make an altar of earth for me and sacrifice on it your bur ...

  8. grails-shiro权限认证

    一.引用shiro插件 //在BuildConfig的plugins下面添加 compile ":shiro:1.2.1" 二.引用新插件后要进行编译 //grails命令 com ...

  9. PHP中的XML解析的5种方法

    [前言]不管是桌面软件开发,还是WEB应用,XML无处不在!然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理,包括生成,解析等.假期有空,于是将PHP中的几种XML解析方法总结如下: ...

  10. Linux 常见的trouble shooting故障排错

    Linux 常见的trouble shooting故障排错 备份开机所必须运行的程序对一个运维人员来说是非常有必要的.在实际生产环境中,系统和数据基本都是安装在不同的硬盘上面,因为企业最关心的还是数据 ...