mprpc框架的配置文件加载

目录

1.回顾测试

2.mprpc框架的配置文件加载

2.1 mprpcconfig.h

2.2 完善mprpcapplication.h

 2.3 完善mprpcapplication.cc

2.4 mprpcconfig.cc 

2.5 test.conf

2.6 测试运行

​3.扩展问题


1.回顾测试

我们先把之前的项目代码工程编译好,然后进入bin里面,执行
./provider

显示我们之前编的代码正确了!
接下来,我们开始编写配置文件

2.mprpc框架的配置文件加载

一开始编写的代码,读取配置文件信息时没有处理好,导致打印结果有多余的空行。

调试信息如下:

 

 

由上图可见是多读了一个\n导致的,更改后如下: 

2.1 mprpcconfig.h

在src的include中创建头文件:mprpcconfig.h

#pragma once#include <unordered_map>
#include <string>//rpcserverip  rpcserverport  zookeeperip   zookeeperport
//框架读取配置文件类
class MprpcConfig
{
public://负责解析加载配置文件void LoadConfigFile(const char* config_file);//查询配置项信息std::string Load(const std::string& key);//返回key所对应的值-字符串 
private:std::unordered_map<std::string,std::string> m_configMap;//去掉字符串前后的空格void Trim(std::string& src_buf);
};

2.2 完善mprpcapplication.h

#pragma once
#include "mprpcconfig.h"//mprpc框架的基础类,负责框架的一些初始化操作
class MprpcApplication
{
public:static void Init(int argc,char** argv);//初始化//单例模式static MprpcApplication& GetInstance();//定义获取唯一实例的方法private:static MprpcConfig m_config;MprpcApplication(){}//构造函数MprpcApplication(const MprpcApplication&)=delete;//将与拷贝构造有关的函数deleteMprpcApplication(MprpcApplication&&) = delete;
};

 2.3 完善mprpcapplication.cc

#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 '?'://std::cout<<"invalid args!"<<std::endl;ShowArgsHelp();exit(EXIT_FAILURE);case ':'://std::cout<<"need <configfile>"<<std::endl;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;
}

2.4 mprpcconfig.cc 

在src下创建文件mprpcconfig.cc 

#include "mprpcconfig.h"#include <iostream>//负责解析加载配置文件
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);Trim(key);//rpcserverip=127.0.0.1\n   int endidx=read_buf.find('\n',idx);//从等号之后开始寻找\nvalue=read_buf.substr(idx+1,endidx-idx-1);Trim(value);m_configMap.insert({key,value});}
}// 查询配置项信息
std::string MprpcConfig::Load(const std::string &key)
{//return m_configMap[key];//不要使用[],会产生副作用,正常情况key如果不存在,会返回空,可是用[]的话,会在map表中增加一对值auto it=m_configMap.find(key);if(it==m_configMap.end()){return "";}return it->second;
}void MprpcConfig::Trim(std::string &src_buf)
{int idx = src_buf.find_first_not_of(' ');if (idx != -1){// 说明字符串前面有空格src_buf = src_buf.substr(idx, src_buf.size() - idx); // 第一个参数是下标,第二个是长度}// 去掉字符串后面多余的空格idx = src_buf.find_last_not_of(' ');if (idx != -1){// 说明字符串后面有空格src_buf = src_buf.substr(0, idx + 1);}
}

2.5 test.conf

在bin下创建一个配置文件:test.conf

#rpc节点的ip地址
rpcserverip=127.0.0.1
#rpc节点的port端口号
rpcserverport=8000
#zk的ip地址
zookeeperip=127.0.0.1
#zk的port端口号
zookeeperport=5000

2.6 测试运行

 编译:

测试结果:

 3.扩展问题

C++中的容器都不是线程安全的,需要解决这个问题吗? 

不需要考虑线程安全,因为整个提供rpc服务的站点启动以后,框架只需要init一次,不需要多线程。为了防止框架被多次初始化,可以在mprpcapplication.h文件中添加一个静态变量,来记录框架是否被初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPOPS-II教程(2): 可复用火箭再入大气层最优轨迹规划问题

问题描述 考虑一类可复用火箭再入大气层最优轨迹规划问题&#xff0c;其动力学方程为 { r ˙ v sin ⁡ γ , θ ˙ v cos ⁡ γ sin ⁡ ψ r cos ⁡ ϕ , ϕ ˙ v cos ⁡ γ cos ⁡ ψ r , v ˙ − F d m − F g sin ⁡ γ , γ ˙ F l cos ⁡ σ m v − ( F g v − v r …

高考填报志愿(选专业),为什么要尊重孩子的选择 ?

没有哪一位父母不希望自己的孩子能够考到理想的大学&#xff0c;甚至光宗耀祖&#xff0c;然而一些比较专制的家长&#xff0c;往往在孩子填报志愿的时候表现出很强的控制欲&#xff0c;希望将自己的意愿强加于孩子身上&#xff0c;并没有考虑到他们的兴趣是什么。其实&#xf…

【IM 服务】新用户为什么刚注册就能收到通知?为什么能接收注册前的通知?

功能说明&#xff1a; 默认新注册的用户可以接收到注册前 7 天内的广播消息。您可以从控制台免费基础功能页面关闭该服务。 开通方式&#xff1a; 访问开发者后台 免费基础功能 1页面&#xff0c;确认应用名称与环境&#xff08;开发 /生产 &#xff09;正确无误后&#xff0c…

springboot+vue+mybatis门窗管理系统+PPT+论文+讲解+售后

如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于仓库信息管理方…

Java-day01--基础知识

1、计算机基础知识&#xff1a; 计算机主要是由硬件和软件组成&#xff0c;软件指的是特定顺序的计算机指令&#xff0c;硬件主要可以看成是系统软件和应用软件等。 目前java主流分成三种&#xff1a;javase&#xff08;标准版&#xff09;、javame&#xff08;小型版&#x…

优化了自制的浏览器主页的全屏功能

第一次修改 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>全屏功能</title><style>…

数据分析必备:一步步教你如何用matplotlib做数据可视化(12)

1、Matplotlib 3D线框图 线框图采用值网格并将其投影到指定的三维表面上&#xff0c;并且可以使得到的三维形式非常容易可视化。plot_wireframe()函数用于此目的 import matplotlib.pyplot as plt import numpy as np import math import seaborn as sns plt.rcParams[font.s…

数据结构-----【链表:基础】

链表基础 1、链表的理论基础 1&#xff09;基础&#xff1a; 链表&#xff1a;通过指针串联在一起的线性结构&#xff0c;每个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个指针…

在flask中加载mnist模型,并预测图片

一、在tensorflow中新建及保存模型 启动Jupyter Notebook 新建Notebook 生成 mnist_model.h5 模型的代码 import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import…

机器人控制系列教程之运动规划(2)

简介 在笛卡尔坐标空间中轨迹规划时&#xff0c;首先用位置矢量和旋转矩阵表示所有相应的机器人节点&#xff0c;其次在所有路径段插值计算相对的位置矢量和旋转矩阵&#xff0c;依次得出笛卡尔坐标空间中的轨迹序列通过求解运动学逆问题得到相应关节位置参数。 优点&#xf…

评测|贪吃小猫疯狂长肉,让它停不下嘴的希喂、鲜朗、帕特真实调研

我发现很多铲屎官存在一个误区&#xff0c;认为“进口即是高贵”&#xff0c;过度信赖进口产品。一见到进口宠物粮就冲动购买&#xff0c;甚至对国产品牌持贬低态度&#xff0c;贴上“质量不佳”、“不符合标准”等标签。 为了更深入地了解这一现象&#xff0c;我深入研究了主食…

【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

问题 这个问题出现在使用URP管线时&#xff0c;我试图用Shader实现血条的制作&#xff0c;并用RenderTexture将视图渲染到RawImage上。 但是渲染结果出现了问题&#xff1a; 可以看到液体边缘的渲染出现了错误&#xff0c;原因不明 在StackFlow上查找后找到了类似的问题&…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17&#xff1a;下载地址&#xff0c;在下图中红色框部分进行下载 2、双击安装&#xff0c;基本都是下一步直到完成。 3、设置系统环境变量&#xff1a;参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行&#xff1a;j…

第三十篇——等价性:如何从等价信息里找答案?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 知道了等价性的逻辑&#xff0c;通过等价性去衡量事物&#xff0c;像是给…

Linux配置网卡详细教程

这个网卡配置然后头痛了两天&#xff0c;看了很多篇关于这方面的文章&#xff0c;但是都没让我成功&#xff0c;可惜工亏不负有心人&#xff0c;然后终于学会了下面此方法 实现完成的效果&#xff1a; 永久修改网卡IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEther…

node带参数命令

不带参数命令示例&#xff1a; node /www/wwwroot/server 带参数命令示例&#xff1a; node /www/wwwroot/server arg1 arg2 arg3 在启动页进行参数处理&#xff1a; // 获取启动参数(除去前2个默认参数&#xff0c;示例&#xff1a;node /www/wwwroot/server arg1 arg2 …

西门子840dsl机床仿真软件配置opcua说明

需要的安装包如下&#xff0c;可在百度网盘中下载 主软件包&#xff1a;sinutrain-v4.7-ed4&#xff08;也可在官网中下载最新版本&#xff09; 用户文件&#xff1a;UserDataBase 授权sinutrain&#xff1a;Sim_EKB_Install_2021_06_22 链接&#xff1a;https://pan.baidu.c…

小阿轩yx-用户管理与高级SQL语句

小阿轩yx-用户管理与高级SQL语句 MySQL 进阶查询 运维工作中可以提供不小的帮助&#xff0c;运维身兼数职&#xff0c;可能会有不少数据库的相关工作 常用查询介绍 对查询的结果集进行处理 按关键字排序 使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来 对结…

第一百二十六节 Java面向对象设计 - Java枚举类

Java面向对象设计 - Java枚举类 枚举类型的超类 编译枚举类型时&#xff0c;编译器会创建一个类。 枚举类型可以具有构造函数&#xff0c;字段和方法。枚举类型仅在编译器生成的代码中实例化。 每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与…

从一到无穷大 #29 ByteGraph的计算,内存,存储三级分离方案是否可以通用化为多模数据库

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言ByteGraph现有架构阿里云Lindorm腾讯YottaDB多模型化修改点ByteGraph论文中的优化…