zoukankan      html  css  js  c++  java
  • RPC调用框架比较分析--转载

    原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90

    什么是RPC: 
    RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 
    简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。 
    比较关键的一些方面包括,通讯协议,序列化,资源(接口)描述,服务框架,性能,语言支持等。 

    典型RPC调用框架: 
    RPC的实现和调用框架,五花八门,简单介绍其中几种比较典型的。 
    RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 
    和java的原生序列化。 
    Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。 
    protobuf-rpc-pro 是一个Java类库,提供了基于 Google 的 Protocol Buffers 协议的远程方法调用的框架。基于 Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志等功能。 
    THRIFT是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。    
      >>>最初由facebook开发用做系统内个语言之间的RPC通信 。 
      >>>2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。 
      >>>支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S RPC调用 。 
      >>>底层通讯基于SOCKET。 
    AVRO,Avro出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下Avro的推出,其目标不仅是提供一套类似Thrift的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和 存储的Protocol。支持HTTP,TCP两种协议。 

    RPC调用框架的过程原理基本类似,以Thrift为例 
    Thrift 协议栈 以及各层的使用(java 为例) 
     

    1、model   interface 
           服务的调用接口以及接口参数model、返回值model 
    2、Tprotocol    协议层 
             将数据(model)编码 、解码 。 
    3、Ttramsport 传输层 
            编码后的数据传输(简单socket、http) 
    5、Tserver 
            服务的Tserver类型,实现了几种rpc调用(多线程、单线程非阻塞IO、多线程非阻塞IO) 

    RPC调用框架比较: 

    Thrift与protobuf-rpc-pro比较 
    1、Another important difference are the languages supported by default.    
    protobuf: Java, C++, Python    
    Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml 
    支持语言不同,thrift支持着更多的语言 
    2、Thrift supports ‘exceptions 。 
       thrift支持服务的异常 。 
    3、Protocol Buffers much easier to read 。Protobuf API looks cleaner, though the generated classes are all packed as an inner classes which is not so nice. 
       Protocol Buffers 在文档方面比thrift丰富,而且比thrift简单 。 
    4、Protobuf serialized objects are about 30% smaller then Thrift. 
       Protocol Buffers在序列化/反序列化、传输上性能更优 。 
    5、RPC is another key difference. Thrift generates code to implement RPC clients and servers wheres Protocol Buffers seems mostly designed as a data-interchange format alone.  
        thrift提供了一套完整的rpc服务实现(多线程socket、单线程非阻塞的socket、多线程非阻塞socket) 
    6、And according to the wiki the Thrift runtime doesn't run on Windows. 
       thrift 对有些语言在windows上不支持:C++   
    摘选自: http://gemantic.iteye.com/blog/1199214 thrift的使用介绍 

    Apache Avro 与 Thrift 比较 
    转自网络, http://www.360doc.com/content/12/0515/08/2716732_211104190.shtml 
    文章有比较详细的对比,值得仔细研读。摘部分内容,如下。 
    Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间件. 它们都提供了数据序列化的功能和RPC服务. 总体功能上类似,但是哲学不一样. Thrift出自Facebook用于后台各个服务间的通讯,Thrift的设计强调统一的编程接口的多语言通讯框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下Avro的推出,其目标不仅是提供一套类似Thrift的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和 存储的Protocol。 这个和Thrift的理念不同,Thrift认为没有一个完美的方案可以解决所有问题,因此尽量保持一个Neutral框架,插入不同的实现并互相交互。 而Avro偏向实用,排斥多种方案带来的 可能的混乱,主张建立一个统一的标准,并不介意采用特定的优化。Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的 数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合 了Hadoop上的Hive/Pig及NOSQL 等既属于ad hoc,又追求性能的应用需求。 

    目前阶段Thrift比Avro支持的语言更丰富. 
    Thrift: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.
    Avro: C, C++, Java, Python, Ruby, PHP. 

    Avro和Thrift处理Schema方法截然不同。 
    Thrift是一个面向编程的系统, 完全依赖于IDL->Binding Language的代码生成。 
    Avro支持2种方式。Avro-specific方式和Thrift的方式相似,依赖代码生成产生特定的类,并内嵌JSON Schema. Avro-generic方式支持Schema的动态加载,用通用的结构(map)代表数据对象,不需要编译加载直接就可以处理新的数据源。 
    Avro的Schema文件有三种格式,依次是avdl,avpr,avsc,后两种是json格式,avdl可以转成avpr。 

    java -jar avroj-tools.jar idl src/test/idl/input/namespaces.avdl /tmp/namespaces.avpr



    关于序列化,avro的机制,有更好的数据的透明度和可操作性,更高的存储效率。 
    Thrift提供了多种序列化的实现: 
    TCompactProtocol: 最高效的二进制序列化协议,但并不是所有的绑定语言都支持。 
    TBinaryProtocol: 缺省简单二进制序列化协议. 

    RPC服务 

    Avro提供了 
    HttpServer : 缺省,基于Jetty内核的服务. 
    NettyServer: 新的基于Netty的服务. 
    Thrift提供了: 
    TThreadPolServer: 多线程服务 
    TNonBlockingServer: 单线程 non blocking的服务 
    THsHaServer: 多线程 non blocking的服务 

    性能测试Benchmarking,两者差相仿佛。 

    Conclusion 
    Thrift适用于程序对程序静态的数据交换,要求schema预知并相对固定。 
    Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift。 
    Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台。 
    目前Thrift的优势在于更多的语言支持和相对成熟 

    比较分析结论: 
    基于以上三种框架比较分析,个人决定采用AVRO框架。 

    相关资源 

    protobuf-rpc-pro-demo-1.1.0及源码 包含在附件中,该文件包中,包含一个1.1.0版本的运行环境(bin,lib中)以及最新3.3版本的demo源码和protobuf-rpc-pro源码。相关代码在官网都可以下载到, http://code.google.com/p/protobuf-rpc-pro/ 
    protobuf-rpc-readme,个人的一点总结 

    thrifttest源码,包含在附件中,该项目包含一个rmi的实现,以及thrift的实现。 

    Avrotest源码,包含在附件中,该项目包含官网提供的一个数据序列化反序列化的两种实现,SpecificMain,GenericMain;Specific方式的接口调用MailMain*;Generic方式的多接口调用,包含http方式和netty方式,http/,netty/;项目涵盖了三种不同的Schema格式。

  • 相关阅读:
    grafana邮箱配置
    grafana集群配置
    CentOS7 配置OOM监控报警
    Mycat使用配置实践
    CentOS7安装JAVA环境
    CentOS7安装MYCAT中间件
    CentOS7安装MySQL5.6
    Mockingbird
    堆的建立与功能实现
    Matlab解决线性规划问题
  • 原文地址:https://www.cnblogs.com/davidwang456/p/4801439.html
Copyright © 2011-2022 走看看