在之前我们提到了很多回MprpcApplication类,这是一个mprpc框架的初始化类。
在此之前,先来看看MprpcConfig 类
MprpcConfig 类
重要成员变量
std::unordered_map<std::string,std::string> m_configMap;
存放配置信息键值对。
本项目配置信息
#rpc节点的ip地址
rpcserverip=127.0.0.1#rpc节点的port端口号
rpcserverport=8000#zk的ip地址
zookeeperip=127.0.0.1#zk的port端口号
zookeeperport=2181
重要成员函数
void LoadConfigFile(const char *config_file);
void MprpcConfig::LoadConfigFile(const char *config_file)
{FILE *pf = fopen(config_file, "r");if (nullptr == pf){std::cout << config_file << "is note exist!" << std::endl;exit(EXIT_FAILURE);}// 1.注释 2.正确的配置项 3.去掉开头多余的空格while (!feof(pf)){char buf[512] = {0};fgets(buf, 512, pf);// 去掉字符串前面多余的空格std::string read_buf(buf);Trim(read_buf);if (read_buf[0] == '#' || read_buf.empty()){continue;}// 解析配置项int idx = read_buf.find('=');if (idx == -1){// 配置项不合法continue;}std::string key;std::string value;key = read_buf.substr(0, idx);//rpcserverip =Trim(key);//rpcserverip=127.0.0.1\nint endidx=read_buf.find('\n',idx);value = read_buf.substr(idx + 1, endidx - idx -1);//rpcserverip= 127.0.0.1 \nTrim(value);m_configMap.insert({key, value});}fclose(pf);
}
- 打开文件
- 去掉多余的空格类,获取正确的配置信息
- 存入m_configMap中
- 关闭文件
void Trim(std::string &src_buf);
用来去掉字符串前后的空格
void MprpcConfig::Trim(std::string &src_buf)
{int idx = src_buf.find_first_not_of(' ');if (idx != 1){// 说明字符串前面有空格,idx返回的是第一个非空格的下标src_buf = src_buf.substr(idx, src_buf.size() - idx);}// 去掉字符串后面多余的空格idx = src_buf.find_last_not_of(' ');if (idx != 1){// 说明字符串后面有空格,idx返回的是最后一个非空格的下标src_buf = src_buf.substr(0, idx + 1);}
}
- 通过
find_first_not_of
以及find_last_not_of
函数去掉前后多余的空格
std::string Load(const std::string &key);
查询配置项信息
std::string MprpcConfig::Load(const std::string &key)
{auto it = m_configMap.find(key);if (it == m_configMap.end()){return "";}return it->second;
}
MprpcApplication类
重要成员变量
static MprpcConfig m_config;
- MprpcConfig 类 用来读取配置文件
重要成员函数
static void Init(int argc,char **argv);
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;}}//开始加载配置文件m_config.LoadConfigFile(config_file.c_str());
}
- getopt() 函数用于解析命令行参数。argc 和 argv 参数通常直接从 main() 的参数直接传递而来。通过
“i:”
来找到从命令行输入的配置文件。 - 通过MprpcConfig,开始加载配置文件
static MprpcApplication& GetInstance();
获取一个单例模式
MprpcApplication& MprpcApplication::GetInstance()
{static MprpcApplication app;return app;
}
static MprpcConfig& GetConfig();
MprpcConfig& MprpcApplication::GetConfig()
{return m_config;
}
- 在rpcrprovider中我们已经看到了两者的调用方式
std::string ip = MprpcApplication::GetInstance().GetConfig().Load("rpcserverip");