一、注册
有一个本地服务,我想把它发布成远程服务,首先在user.proto中定义rpc方法的描述,定义参数和响应的消息类型
然后在userservice.cc文件中通过继承UserServiceRpc这个类,重写一下响应的方法(打四个动作)如下
userservice.cc
别人调用的话,在calluserservice.cc
测试register
二、好友模块(新增获取好友列表功能)
friend.proto
syntax="proto3";package fixbug;option cc_generic_services=true;message ResultCode
{int32 errcode=1;bytes errmsg=2;
}//函数的参数类型
message GetFriendsListRequest
{uint32 userid=1;
}//函数的返回值类型
message GetFriendsListResponse
{ResultCode result=1;repeated bytes friends=2;//repeated可重复的。表示有很多好友
}//好友模块
service FriendServiceRpc
{rpc GetFriendsList(GetFriendsListRequest) returns(GetFriendsListResponse);
}
friendservice.cc
#include <iostream>
#include <string>
#include <vector>
#include "friend.pb.h"
#include "mprpcapplication.h"
#include "rpcprovider.h"class FriendService:public fixbug::FriendServiceRpc//使用在rpc服务发布端(rpc服务提供者)
{
public:std::vector<std::string> GetFriendsList(uint32_t userid)//返回好友的列表,本地方法{std::cout<<"do GetFriendsList service! userid:"<<userid<<std::endl;std::vector<std::string> vec;vec.push_back("gao yang");vec.push_back("liu hong");vec.push_back("wang shuo");return vec;}//重写基类方法void GetFriendsList(::google::protobuf::RpcController* controller,const ::fixbug::GetFriendsListRequest* request,::fixbug::GetFriendsListResponse* response,::google::protobuf::Closure* done){uint32_t userid=request->userid();//获取用户的id号std::vector<std::string> friendsList=GetFriendsList(userid);//调用本地方法response->mutable_result()->set_errcode(0);//执行成功response->mutable_result()->set_errmsg("");for(std::string &name:friendsList)//遍历好友列表{std::string *p=response->add_friends();//添加*p=name;}done->Run();}
};int main(int argc,char **argv)//需要配置文件
{//调用框架初始化操作 provider -i config.confMprpcApplication::Init(argc,argv);//整个框架的初始化操作,日志,配置等等。//provider是一个rpc网络服务对象。把UserService对象发布到rpc节点上RpcProvider provider;//可以调用多次,生成多个远程RPC服务provider.NotifyService(new FriendService());//发布服务//启动一个rpc服务发布节点 Run以后,进程进入阻塞状态,等待远程的rpc调用请求provider.Run();return 0;
}
callfriendservice.cc
#include <iostream>
#include "mprpcapplication.h"
#include "friend.pb.h"
#include "mprpcchannel.h"int main(int argc,char** argv)
{//整个程序启动以后,想使用mprpc框架来享受rpc服务调用,一定需要先调用框架的初始化函数(只初始化一次)MprpcApplication::Init(argc,argv);//演示调用远程发布的rpc方法Loginfixbug::FriendServiceRpc_Stub stub(new MprpcChannel());//rpc方法的请求参数fixbug::GetFriendsListRequest request;request.set_userid(1000);//rpc方法的响应fixbug::GetFriendsListResponse response;//发起rpc方法的调用 同步的rpc调用过程 MprpcChannel::callmethodstub.GetFriendsList(nullptr,&request,&response,nullptr);//RpcChannel->RpcChannel::callMethod 集中来做所有rpc方法调用的参数序列化和网络发送//一次rpc调用完成,读调用的结果if(0==response.result().errcode()){std::cout<<"rpc GetFriendsList response success:"<<std::endl;int size=response.friends_size();//获取好友的数量for(int i=0;i<size;++i){std::cout<<"index:"<<(i+1)<<"name:"<<response.friends(i)<<std::endl;}}else{std::cout<<"rpc GetFriendsList response error:"<<response.result().errmsg()<<std::endl;}return 0;
}
更改一下CMakelists.txt
测试结果: