mprpc框架的应用示例

一、注册

有一个本地服务,我想把它发布成远程服务,首先在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

 

测试结果: 

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值