一、注册
有一个本地服务,我想把它发布成远程服务,首先在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.conf
MprpcApplication::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方法Login
fixbug::FriendServiceRpc_Stub stub(new MprpcChannel());
//rpc方法的请求参数
fixbug::GetFriendsListRequest request;
request.set_userid(1000);
//rpc方法的响应
fixbug::GetFriendsListResponse response;
//发起rpc方法的调用 同步的rpc调用过程 MprpcChannel::callmethod
stub.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
测试结果: