前言
RPC采用客户机/服务器模式实现两个进程之间的相互通信,socket是RPC经常采用的通信手段之一。当然,除了socket,RPC还有其他的通信方法:http、管道。。。网络开源的RPC框架也比较多,一个功能比较完善的RPC框架代码比较多,如何快速的从这些代码盲海中梳理清楚主要脉络,对于初学者来说比较困难,本文介绍之前自己实现的一个C++极简版的RPC框架,代码只有100多行,希望尽量用少的代码来描述框架以减轻初学者的学习负担,同时便于大家阅读网络上复杂的RPC源码。
1、经典的RPC框架echo例子里面,EchoServer_Stub类是哪里来的?
2、为什么stub.Echo(&controller, &request, &response, nullptr); 调用就执行到server端的Echo函数?
3、stub.Echo(&controller, &request, &response, nullptr); 最后一个参数是nullptr,调用到server端的Echo(controller, request, response, done) 函数时,done指针为什么不为空了?
…
让我们通过下面这个简单的RPC框架,一层一层解开上面的疑惑。
echo_server.cc
复制代码
class EchoServerImpl : public goya::rpc::echo::EchoServer {
public:
EchoServerImpl() {}
virtual ~EchoServerImpl() {}
private:
virtual void Echo(google::protobuf::RpcController* controller,
const goya::rpc::echo::EchoRequest* request,
goya::rpc::echo::EchoResponse* response,
google::protobuf::Closure* done)
{
std::cout << "server received client msg: " << request->message() << std::endl;
response->set_message(
"server say: received msg: ***" + request->message() + std::string("***"));
done->Run();
}
};
int main(int argc, char* argv[])
{
RpcServer rpc_server;
goya::rpc::echo::EchoServer* echo_service = new EchoServerImpl();
if (!rpc_server.RegisterService(echo_service, false)) {
std::cout << "register service failed" << std::endl;
return -1;
}
std::string server_addr("0.0.0.0:12321");
if (!rpc_server.Start(server_addr)) {
std::cout << "start server failed" << std::endl;
return -1;
}
return 0;
}
复制代码
echo_client.cc
复制代码
int main(int argc, char* argv[])
SmallHouseColleague smallHouseColleague www.feihongyul.cn= new SmallHouseColleague(www.tianyueylezc
C++极简版的RPC框架
最新推荐文章于 2024-08-14 18:25:50 发布
本文通过一个100多行代码的C++极简RPC框架,详细解释了RPC客户机/服务器通信过程,包括EchoServerImpl、EchoService_Stub、RpcController等关键组件的工作原理,帮助初学者理解RPC框架的实现细节。文章通过分析代码,解答了关于RPC调用过程中的一些常见疑问。
摘要由CSDN通过智能技术生成