C ++ RPC库建议

时间:2010-12-04 05:34:42

标签: c++ rmi rpc

我正在寻找有关C ++实现的用于C ++开发人员的RPC库的建议。

一些要求限制:

  • 应该同时适用于linux / unix和win32系统
  • 能够执行自由函数和类方法
  • 希望用现代C ++编写而不是90年代/ java-esque C ++
  • 能够通过网络和hetrogenous架构运作
  • 不太慢或效率不高
  • 希望为TR1风格的std :: function等等提供接口。

我的示例用法是在远程计算机上调用free function foo。

---snip---
// foo translation unit
int foo(int i, int j)
{
   return i + j;
}
---snip---


---snip---
// client side main
int main()
{
   //register foo on client and server
   //setup necassary connections and states

   int result;

   if (RPCmechanism.invoke("foo",4,9,result))
      std::cout << "foo(4,9) = " result << std::endl;
   else
      std::cout << "failed to invoke foo(4,9)!" << std::endl;

   return 0;
}
---snip---

能够实现上述或类似目标的东西会很棒。

注意:我对其他语言绑定不感兴趣。请不要提供解决方案,因为它有其他语言绑定。我只对使用C ++编写的用于C ++语言的精心设计的RPC框架感兴趣,这些框架对于HPC场景是高效且适用的。

8 个答案:

答案 0 :(得分:8)

这是一系列要求......

虽然没有满足所有这些(因为我不确定任何这样的野兽存在 - 我推荐你注意来自ZeroC的ICE。部分由MBA Henning开发的CORBA成名(并询问你的朋友们)电信,这真的不是一个肮脏的词),ICE是CORBA看起来的样子,如果它后来开始并且不是由委员会开发的。

他们的C ++映射是CORBA不是的所有东西,它使用STL类型,并且通常是更新的感觉。

它没有通过自由函数和std :: function测试,但由于不可能为整个列表找到产品,这对其余的很多都做得很好。

祝你好运

答案 1 :(得分:7)

我也对可行的C ++ RPC实现感兴趣。经过一些研究,我发现蚀刻,节约和协议缓冲是最有希望的解决方案,但它们都没有真正满足我的所有需求。我的搜索条件是:

  1. 多语言,必须使用C ++和PHP(C#,Java,Python,Perl现在不是那么重要)
  2. 服务器可以仅在Linux上编译/运行(以Windows作为长期目标)
  3. 客户端必须在Windows和Linux(可能还有Mac)上运行
  4. 开源和商业友好(即没有GPL)
  5. 它必须支持开箱即用的加密
  6. 候选人是:

    1. Apache Etch

      优点:

      • C绑定基于APR
      • 支持加密
      • 在两个平台上运行

      缺点

      • 发展缓慢
      • 缺少PHP绑定
    2. Apache Thrift

      优点:

      • 多语言绑定

      缺点:

      • 目前,它不支持加密(正在开发中,至少对于C ++绑定而言)
      • 在Windows上,它需要Cygwin
    3. 具有内部开发的RPC解决方案的协议缓冲区

      优点:

      • 多语言绑定

      缺点:

      • 没有内置RPC
    4. 目前,我正在评估使用APR为Protobuf开发RPC层的可能性。

      然而,搜索继续......

      编辑:我设法通过使用带有protobuf的Apache Qpid(C ++版本)进行序列化来解决其中的一些问题,尽管它目前缺少我需要的一些功能。

答案 2 :(得分:5)

旧的,如DCE-RPC,CORBA,

Protocol Buffers,或ThriftEtch

或Web,如SOAP或REST。

你想要哪一个取决于你想做什么。例如。快速高效的本地网络RPC需要像协议缓冲区这样的轻量级二进制RPC,但异构Web服务的RPC需要更加冗长的SOAP。

Google将PB用于其所有内部RPC,因此这是一个不错的选择。 Facebook使用Thrift,因此它不是一个小玩家,MS喜欢SOAP。

答案 3 :(得分:3)

你有没有尝试过节俭,http://thrift.apache.org/

答案 4 :(得分:2)

查看FastRPC,http://fastrpc.sourceforge.net/

答案 5 :(得分:2)

RCF看起来像你想要的:http://www.deltavsoft.com/index.html

答案 6 :(得分:1)

你可以自己使用protobuf工具,并添加你想要的所有功能。它并不太难,你可以从中获益良多。

答案 7 :(得分:1)

从示例TAO CORBA客户端提取的以下代码显示连接到服务器需要3行代码,以及调用函数的一行代码。请注意,函数调用看起来像本机本地函数调用。这可以是自由函数,也可以是成员函数。

// Bring in the IOR
Object_var factory_object =  orb->string_to_object (argv[1]);

// Now downcast the object reference 
My_Factory_var factory = My_Factory::_narrow (factory_object.in ());

// Now get the full name and price of the other arguments:
Widget_var widget = factory->get_widget (argv[i]);

// Get its name, put it on a _var so it is automatically
// released!
String_var full_name = widget->full_name ();

// Now get the price
Double price = widget->price ();

cout << "The price of a widget in \""
  << full_name.in () << "\" is $"
  << price << endl;

服务器代码显示起来有点复杂,但在CORBA中,对于您要做的事情,大多数情况下,您创建一个IDL接口,通过编译器运行它,然后在相应的插槽中填写您的应用程序逻辑在存根中。因此,您的主要代码如下所示:

// First initialize the ORB, that will remove some arguments...
ORB_var orb = ORB_init(argc, argv, "ORB" /* the ORB name, it can be anything! */);
Object_var poa_object = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_object.in());
PortableServer::POAManager_var poa_manager = poa->the_POAManager();
poa_manager->activate();

// Create the servant
My_Factory_i my_factory_i;

// Activate it to obtain the object reference
My_Factory_var my_factory = my_factory_i._this();

// Put the object reference as an IOR string
String_var ior = orb->object_to_string (my_factory.in());
orb->run();

    // Now in your stub file generated by the idl compiler, 
    char * Widget_i::full_name (

  )
  ACE_THROW_SPEC ((
    ::CORBA::SystemException
  ))
{
  return "Some widget name";
}

::CORBA::Double Widget_i::price (

  )
  ACE_THROW_SPEC ((
    ::CORBA::SystemException
  ))
{
  return 1.25;
}

查看This WikiBook for more references and examples