目录
1.回顾
2.主函数书写
3.框架设计
3.1 mprpcapplication.h
3.2 rpcprovider.h
3.3 mprpcapplication.cc
3.4 mprpcprovider.cc
1.回顾
mprpc框架怎么用?
在上一节,我们完成了如何把本地服务发布成RPC服务。
我们打开example下callee下的userservice.cc
#include <iostream>
#include <string>
#include "user.pb.h"
/*
UserService原来是一个本地服务,提供了两个进程内的本地方法,Login和GetFriendLists
*/
class UserService:public fixbug::UserServiceRpc//使用在rpc服务发布端(rpc服务提供者)
{
public:
bool Login(std::string name,std::string pwd)
{
std::cout<<"doing local service:Login"<<std::endl;
std::cout<<"name:"<<name<<" pwd:"<<pwd<<std::endl;
return true;
}
/*
重写基类UserServiceRpc的虚函数 下面这些方法都是框架直接调用的
1.caller ===> Login(LoginRequest) =>muduo => callee
2.callee ===> Login(LoginRequest) =>交到下面重写的这个Login方法上了
*/
void Login(::google::protobuf::RpcController *controller,
const ::fixbug::LoginRequest * request,
::fixbug::LoginResponse * response,
::google::protobuf::Closure *done)
{
//框架给业务上报了请求参数LoginRequest,应用获取相应数据做本地业务
std::string name = request->name();
std::string pwd = request->pwd();
//做本地业务
bool login_result=Login(name,pwd);
//把响应写入 包括错误码、错误消息、返回值
fixbug::ResultCode* code=response->mutable_result();
code->set_errcode(0);
code->set_errmsg("");
response->set_success(login_result);
//执行回调操作 执行响应对象数据的序列化和网络发送(都是由框架来完成的)
done->Run();
}
};
2.主函数书写
我们现在书写主函数
我们希望实现后的mprpc框架,可以这么使用:
int main(int argc,char **argv)
{
//调用框架初始化操作
MprpcApplication::Init(argc,argv);
//provider是一个rpc网络服务对象。把UserService对象发布到rpc节点上
RpcProvider provider;
provider.NotifyService(new UserService());
//启动一个rpc服务发布节点 Run以后,进程进入阻塞状态,等待远程的rpc调用请求
provider.Run();
return 0;
}
可以调用多次,生成多个远程RPC服务
如果可以这么使用的话,想把本地业务变成远程服务就很简单了:定义proto文件,继承UserServiceRpc类,然后重写方法,打4套动作(上报请求并从中取数据、做本地业务、填写响应、执行回调)。就OK了。
然后要发布服务,就初始化框架,定义一个可以发布服务的对象,在这个对象上发布服务。provider是一个rpc网络的服务对象。把UserService对象发布到rpc节点上。Run以后,进程进入阻塞状态,等待远程的rpc调用请求。
我们接下来将往这个方向去设计框架
3.框架设计
我们实现框架的代码存放在src中,我们在src下再创一个文件夹:include;用来存放头文件。
3.1 mprpcapplication.h
在include下创建头文件:mprpcapplication.h
#pragma once
//mprpc框架的基础类,负责框架的一些初始化操作
class MprpcApplication
{
public:
static void Init(int argc,char** argv);//初始化
//单例模式
static MprpcApplication& GetInstance()//定义获取唯一实例的方法
{
static MprpcApplication app;
return app;
}
private:
MprpcApplication(){}//构造函数
MprpcApplication(const MprpcApplication&)=delete;//将与拷贝构造有关的函数delete
MprpcApplication(MprpcApplication&&) = delete;
};
3.2 rpcprovider.h
RpcProvider是一个网络的服务对象,要做到高并发,使用muduo库实现。 我们再定义一个头文件:rpcprovider.h
#pragma once
#include "google/protobuf/service.h"
//框架提供的专门发布rpc服务的网络对象类
class RpcProvider
{
public:
//这里是框架提供给外部使用的,可以发布rpc方法的函数接口
void NotifyService(google::protobuf::Service* service){}//具体的服务对象类是从Service类继承而来
//框架是可以接收各种RPC服务的,不能依赖具体的某一个业务。
//基类指针指向子对象
//启动rpc服务节点,开始提供rpc远程网络调用服务
void Run();
};
我们把这2个头文件写到userservice.cc
接下来我们在src下创建
mprpcprovider.cc
mprpcapplication.cc
3.3 mprpcapplication.cc
#include "mprpcapplication.h"
void MprpcApplication::Init(int argc, char **argv) // 初始化
{
}
// 单例模式
MprpcApplication &MprpcApplication::GetInstance() // 定义获取唯一实例的方法
{
static MprpcApplication app;
return app;
}
3.4 mprpcprovider.cc
#include "rpcprovider.h"
//这里是框架提供给外部使用的,可以发布rpc方法的函数接口
void RpcProvider::NotifyService(google::protobuf::Service *service)
{
}
// 启动rpc服务节点,开始提供rpc远程网络调用服务
void RpcProvider::Run()
{
}