在RPC服务的发布方需要做的事情:
- 调用框架的初始化操作
- 把service对象发布到rpc节点上
- 启动rpc服务节点,等待远程rpc调用请求
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;
}
mprpcApplication类的设计
#pragma once
// mprpc框架的基础类,用单例模式来设计
// 负责框架的一些初始化操作
class MprpcApplication
{
public:
static void Init(int argc, char** argv);
static MprpcApplication& GetInstance();
static MprpcConfig& GetConfig();
private:
static MprpcConfig m_config;
MprpcApplication(){}
MprpcApplication(const MprpcApplication&) = delete;
MprpcApplication(MprpcApplication&&) = delete;
};
源文件方法实现
使用getopt来读取
#include "mprpcApplication.h"
#include <iostream>
#include <unistd.h>
MprpcConfig MprpcApplication::m_config;
void ShowArgsHelp()
{
std::cout << "format: command -i<configfile> " << std::endl;
}
void MprpcApplication::Init(int argc, char** argv)
{
if (argc < 2)
{
ShowArgsHelp();
exit(EXIT_FAILURE);
}
int c = 0;
std::string config_file;
while ((c = getopt(argc, argv, "i: ")) != -1)
{
switch (c)
{
case 'i':
config_file = optarg;
break;
case '?':
ShowArgsHelp();
exit(EXIT_FAILURE);
case ':':
ShowArgsHelp();
exit(EXIT_FAILURE);
default:
break;
}
}
// 开始加载配置文件
// rpcserver_ip= rpcserver_port= zookeeper_ip= zookeeper_port=?
m_config.LoadConfigFile(config_file.c_str());
// std::cout << "rpcserverip: " << m_config.Load("rpcserverip") << std::endl;
// std::cout << "rpcserverport: " << m_config.Load("rpcserverport") << std::endl;
// std::cout << "zookeeperip: " << m_config.Load("zookeeperip") << std::endl;
// std::cout << "zookeeperport: " << m_config.Load("zookeeperport") << std::endl;
}
MprpcApplication& MprpcApplication::GetInstance()
{
static MprpcApplication app;
return app;
}
MprpcConfig& MprpcApplication::GetConfig()
{
return m_config;
}