最近准备在框架中使用RPC,粗粗看了下几种RPC的使用,为了效率准备使用一种保持长链接的RPC。之前看到protobuf官网上提到有protobuf实现的RPC特别留意了一下,几翻比较下选择了RCF。

RCF是c++实现的一个RPC,用到了boost::asio,protobuf等库都是平常常用的一些库。所以准备使用并仔细研读的

pb官网实现的RPC页https://code.google.com/p/protobuf/wiki/ThirdPartyAddOns

RCF官网http://www.deltavsoft.com/doc/

一个简单的例子

Person.proto:

message Person {
    required int32 id = 1;
    required string name = 2;
    optional string email = 3;
}

message PbEmpty {
    optional string log = 1;
}

main.cpp

#define RCF_USE_PROTOBUF

#include <RCF/RCF.hpp>
#include "Person.pb.h"

#include <iostream>

/*声明了三种接口                             		*/ 
/*以RCF_METHOD_XX命名 V表示void R表示有返回值		*/
/*数字表示参数的数量                         		*/
/*client和server都要引用此段声明				*/
RCF_BEGIN(I_HelloWorld, "I_HelloWorld")
    RCF_METHOD_V1(void, Print, const std::string &)
    RCF_METHOD_V1(void, Print, const Person &)
    RCF_METHOD_R2(int, Print, const Person &, Person &)
RCF_END(I_HelloWorld)


/*远程服务器代码的实现*/
class HelloWorldImpl
{
public:
    void Print(const std::string & s)
    {
        std::cout << "I_HelloWorld service: " << s << std::endl;
    }

    void Print(const Person& person)
    {
        // std::cout << person.id() << std::endl
        //     << person.name() << std::endl
        //     << person.email() << std::endl;
    }

    int Print(const Person& in, Person& out)
    {
        // std::cout << person.id() << std::endl
        //     << person.name() << std::endl
        //     << person.email() << std::endl;
    	out = in;

    	return 1;
    }
};


int main()
{
    RCF::RcfInitDeinit rcfInit;

    HelloWorldImpl helloWorld;
    RCF::RcfServer server( RCF::TcpEndpoint(50001) );
    server.bind<I_HelloWorld>(helloWorld);
    server.start();

    RcfClient<I_HelloWorld>( RCF::TcpEndpoint("127.0.0.1", 50001) ).Print(std::string("123"));

    Person person;
    Person reslut;
    person.set_id(1);
    person.set_name("zunceng");
    person.set_email("zunceng@gmail.com");
    reslut.set_id(0);
    reslut.set_name("");
    RCF::TcpEndpoint tcp("127.0.0.1", 50001);
    RcfClient<I_HelloWorld> rcfclient(tcp);


    try{
	rcfclient.Print(person, reslut);
        std::cout << reslut.id() << std::endl
			 << reslut.name() << std::endl
			 << reslut.email() << std::endl;
    }
    catch(std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
 
    std::cout << "Press Enter to exit..." << std::endl;
    std::cin.get();

    return 0;
}

RCF使用比较灵活远程调用当法也比较方便