我正在寻找有关C ++实现的用于C ++开发人员的RPC库的建议。
一些要求限制:
我的示例用法是在远程计算机上调用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场景是高效且适用的。
答案 0 :(得分:8)
这是一系列要求......
虽然没有满足所有这些(因为我不确定任何这样的野兽存在 - 我推荐你注意来自ZeroC的ICE。部分由MBA Henning开发的CORBA成名(并询问你的朋友们)电信,这真的不是一个肮脏的词),ICE是CORBA看起来的样子,如果它后来开始并且不是由委员会开发的。
他们的C ++映射是CORBA不是的所有东西,它使用STL类型,并且通常是更新的感觉。
它没有通过自由函数和std :: function测试,但由于不可能为整个列表找到产品,这对其余的很多都做得很好。
祝你好运
答案 1 :(得分:7)
我也对可行的C ++ RPC实现感兴趣。经过一些研究,我发现蚀刻,节约和协议缓冲是最有希望的解决方案,但它们都没有真正满足我的所有需求。我的搜索条件是:
候选人是:
Apache Etch
优点:
缺点
Apache Thrift
优点:
缺点:
具有内部开发的RPC解决方案的协议缓冲区
优点:
缺点:
目前,我正在评估使用APR为Protobuf开发RPC层的可能性。
然而,搜索继续......
编辑:我设法通过使用带有protobuf的Apache Qpid(C ++版本)进行序列化来解决其中的一些问题,尽管它目前缺少我需要的一些功能。
答案 2 :(得分:5)
旧的,如DCE-RPC,CORBA,
或Protocol Buffers,或Thrift,Etch,
或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;
}