答案:一个简单的C++ RPC框架包含服务端、客户端、序列化、网络通信和Stub代理。使用Protobuf定义Request和Response消息格式,通过protoc生成C++代码实现序列化;服务端用socket监听TCP连接,接收并反序列化请求,通过std::map注册函数名与std::function的映射实现反射调用;客户端封装调用逻辑到Stub类,如CalculatorStub::Add,隐藏网络细节;调用时序列化参数和方法名发送至服务端,服务端执行对应函数后返回结果。核心是解耦本地调用与远程通信,实现透明分布式调用。

实现一个简单的RPC(远程过程调用)框架,核心是让客户端像调用本地函数一样调用远程服务端的函数。在C++中,可以通过序列化、网络通信和动态调用机制来完成。下面是一个简化但完整的RPC框架实现思路,适合入门分布式编程。
1. RPC框架的基本组成
RPC框架通常包含以下几个部分:
- 服务端(Server):注册并暴露可被远程调用的函数。
- 客户端(Client):发起远程调用,传参并获取结果。
- 序列化与反序列化:将函数名、参数等数据转换为字节流传输。
- 网络通信:使用TCP或HTTP进行数据传输。
- Stub机制:客户端和服务端的代理层,隐藏网络细节。
2. 使用Protobuf作为序列化工具
Google Protocol Buffers 是C++中常用的高效序列化库。定义一个.proto文件描述请求和响应结构:
syntax = "proto3";package rpc;
message Request {
string method_name = 1;
bytes args = 2;
}
message Response {
int32 code = 1;
bytes result = 2;
}
通过protoc编译生成C++代码,用于序列化请求和响应。
立即学习“C++免费学习笔记(深入)”;
3. 网络通信:基于TCP的简单实现
使用socket编写一个同步TCP服务器和客户端。
服务端监听连接:
- 创建socket,绑定端口,监听客户端连接。
- 接收客户端发来的Request对象(先读长度,再读数据)。
- 反序列化后查找对应函数并执行。
- 将结果序列化为Response返回。
客户端调用流程:
- 连接服务端。
- 构造Request,填入方法名和序列化后的参数。
- 发送到服务端,等待Response。
- 反序列化结果,返回给调用者。
4. 函数注册与反射调用模拟
C++没有原生反射,可以用std::function和std::map模拟:
std::map<:string std::function std::string>> service_map;void RegisterMethod(const std::string& name, std::function<:string std::string> func) {
service_map[name] = func;
}
服务端收到请求后,根据method_name从map中查找并调用对应函数。
5. 客户端代理(Stub)设计
为了更贴近“本地调用”,可以为每个远程服务生成一个代理类:
class CalculatorStub {public:
int Add(int a, int b) {
// 序列化a, b
// 发送请求到服务端 "Add"
// 接收并反序列化结果
return result;
}
};
这样用户代码只需调用stub.Add(1, 2),无需关心网络细节。
基本上就这些。一个轻量级的RPC框架可以基于以上模块搭建。后续可扩展异步IO、服务发现、超时重试等特性。重点在于解耦调用逻辑与通信过程,让分布式调用尽可能透明。不复杂但容易忽略的是错误处理和序列化兼容性。










