史上最便捷的RPC框架
这是史上最便捷的RPC框架,无须定义中间结构文件,只需要再服务代码写好后,对供远程访问的函数进行注册,即可通过自解释生成客户端的stub文件。
源码地址:https://gitee.com/lingluonianhua/zeroRpc.git
第一步:定义rpc业务实现类
class TestRpc
{
public:
//Rpc框架初始化函数
static void OpcodeInit()
{
//Rpc 服务定义, 用于触发将该类加入到rpc框架中进行初始化
RPC_SERVER_DEF(TestRpc);
//Rpc接口定义
RPC_BIND(&TestRpc::GetTotalScore);
RPC_BIND(&TestRpc::Login);
}
std::map<std::string, int> GetTotalScore(std::map<std::string, std::map<std::string, int>> mapVal)
{
std::map<std::string, int> Score;
......
return Score;
}
bool Login(std::string& strUser, std::string& strPwd)
{
return strUser == "admin" && strPwd == "admin123";
}
};
第二部、main函数中加入客户端stub自动生成代码
int main(int argc, char* argv[])
{
RpcInit();
if (argc == 3 && std::string(argv[1]) == "GenerateStub")
{
std::string strPath = argv[2];
std::cout << "开始生成客户端stub文件, 路径:" << strPath << std::endl;
//生成客户端stub代码
CStubGenerateAgent::get_instance().GenerateStubFile(strPath);
return 0;
}
}
第三部、现在可以开始写客户端代码
//定义Rpc网络通道
CRpcChannelPtr pChannel(new MsgRpcChannel);
TestRpc_Stub stub(pChannel);
std::map<std::string, std::map<std::string, int>> score;
score["张三"].emplace("语文", 99);
score["张三"].emplace("数学", 120);
score["李四"].emplace("语文", 108);
score["李四"].emplace("数学", 112);
//调用服务端函数
auto ret = stub.GetTotalScore(score);
if (ret.Code() == RPC_SUCCESS)
{
auto val = std::move(ret.GetVal());
for (auto item : val)
{
std::cout << item.first << ":" << item.second << std::endl;
}
}
四、rpc服务
auto resPkg = CRpcDispatchAgent::get_instance().Dispatch(strPkg);
注:目前暂未实现网络层的数据传输。