[分布式网络通讯框架]----MprpcApplication实现

在之前我们提到了很多回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");
实际上,就是通过读取配置文件,得到我们想要的数据,然后提供rpc远程网络调用服务

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

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

相关文章

Spring Boot中的国际化(i18n)实现技巧

Spring Boot中的国际化&#xff08;i18n&#xff09;实现技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在开发多语言支持的应用程序时&#xff0c;国际化…

python环境变量

目录 python环境变量 python-opencv cuda cudnn pytorch pycharm 激活ok了 pyqt5 labelimg notepad gpu-z python 3.6或3.7 标注,文件路径不能有 python环境变量 import os import syscurrent_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(…

浏览器扩展V3开发系列之 chrome.commands 快捷键的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.commands API 允许开发者使用快捷键来执行特定的命令。 在使用 chrome.commands API 之前必须…

Vue 学习之 axios

目录 执行安装命令&#xff1a;npm install axios 使用的时候导入 axios以data&#xff0c;params&#xff0c;headers传参方式的区别 axios封装 是一个基于 promise 的 网络请求库&#xff0c;作用于浏览器和 node.js 中。使用Axios可以在前端项目中发送各种方式的HTTP请求…

如何查看websocket连接信息

Chrome 浏览器中查看 webSocket 连接信息_谷歌浏览器看不到 websocket-CSDN博客 Getting Started — Flask-SocketIO documentation 运作原理 | Socket.IO

VS Code准备JAVA环境

背景 由于IntelliJ IDEA是需要激活码的,简单的java demo测试,除了可以直接使用命令行java和javac进行执行, 推荐使用VS code, 其功能比较强大,扩展插件也比丰富,对阅读和书写代码都是比较友好的. JDK环境准备 Linux JDK可以使用Open JDK 11. sudo apt-get install openjdk-1…

Git+Maven+Jenkins的增量发布

项目结构大致如下&#xff1a; platform-server ├─doc ├─platform-base ├─platform-bom-dependencies ├─platform-commons │ ├─platform-commons-core │ ├─platform-commons-dubbo │ ├─platform-commons-geo │ ├─platform-commons-lang │ ├─platf…

UE引擎实现ShadowMap、体积光(C++)

前言 整体上参考了YivanLee大佬的这两篇文&#xff1a; 虚幻4渲染编程&#xff08;灯光篇&#xff09;【第一卷&#xff1a;各种ShadowMap】 虚幻4渲染编程&#xff08;灯光篇&#xff09;【第二卷&#xff1a;体积光】 正文 1、ShadowMap &#xff08;1&#xff09;创建工…

【浦语开源】深入探索:大模型全链路开源组件 InternLM Lagent,打造灵笔Demo实战指南

一、准备工作&#xff1a; 1、环境配置&#xff1a; pip、conda换源&#xff1a; pip临时换源&#xff1a; pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple some-package# 这里的“https://mirrors.cernet.edu.cn/pypi/web/simple”是所换的源&#xff0c;…

C++设计模式---模版方法模式

1、介绍 概念&#xff1a; 模板方法模式&#xff08;Template Method Pattern&#xff09;【行为型模式】&#xff0c;定义一个操作中算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 …

AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸

大家好&#xff0c;我是画画的小强 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换&#xff0c;从而让你的图片焕发新生。 前期准备 本文会使用到Inpaint Anyt…

密码学及其应用——专用名词(法语版)

1. 密码学概念 1. cryptographie - 密码学 2. cryptosystme - 密码系统 3. cryptographie symtrique - 对称密码学 4. cryptographie asymtrique - 非对称密码学 5. cryptographie quantique - 量子密码学 6. stganographie - 隐写术 2. 加密与解密 1. cryptage - 加密 2. dc…

如何优化Spring Boot应用的启动时间

如何优化Spring Boot应用的启动时间 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将讨论如何优化Spring Boot应用的启动时间&#xff0c;提升应用的性…

代码随想录算法训练营第六天|242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

打卡Day6 1.哈希表理论基础2.242.有效的字母异位词2.349. 两个数组的交集3.202. 快乐数4.1. 两数之和 1.哈希表理论基础 文档讲解&#xff1a; 代码随想录 当遇到要快速判断一个元素是否出现在集合中时&#xff0c;要考虑哈希法。但是哈希法牺牲了空间换取了时间&#xff0c;…

观星观景大屏呈现 实时拍摄长焦定格 当当狸智能天文望远镜TW2来啦

《宇宙的奇迹》中有这样一句话&#xff1a;“我们与那些遥远星系息息相关&#xff0c;无论它们是如何与我们天各一方&#xff0c;那些经过数十亿年旅行到达地球的光线&#xff0c;终究会把我们联系在一起”。 想象一下—— 等到繁星低垂&#xff0c;月光皎洁之时&#xff0c;…

随机森林回归原理详解及Python代码示例

随机森林回归原理详解 随机森林回归&#xff08;Random Forest Regression&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并将它们的预测结果进行平均&#xff0c;来提高模型的稳定性和预测准确性。它通过引入随机性来增强模型的泛化能力&#xff0c;有效减轻了…

【SQL Server数据库】存储过程的使用

目录 一、要求 1&#xff0e;创建一个存储过程 Proc_Course&#xff0c;查看“0108”号课程的选修情况&#xff0c;包括学生学号、姓名和成绩&#xff0c;然后执行该过程 2&#xff0e;创建一个存储过程 Proc_SC1&#xff0c;通过学生学号来查询学生选修情况&#xff0c;默认…

Spring Cloud Gateway 跨域配置和跨服务请求跟踪

文章目录 引言I Spring Cloud Gateway 跨域配置1.1 网关统一处理:配置文件-推荐1.2 网关统一处理:配置类方式1.3 微服务处理,网关侧不用处理CORS。1.4 子服务依赖配置1.5 网关服务的依赖配置II 跨服务请求日志跟踪2.1 feign 依赖配置2.2 feign子模块将请求头中的参数,全部作…

Linux系统安装和卸载nginx

&#x1f4d6;Linux系统安装和卸载nginx ✅下载✅安装✅启动nginx✅安装成系统服务✅常见问题&#xff1a;80端口被占用了✅卸载✅目录结构 以下介绍的是以源码编译安装方式&#xff1a; ✅下载 官方地址&#xff1a;https://nginx.org/en/download.html 123云盘地址&#x…

pytest的搜索路径和导入模式

搜索路径 指定路径下面所有的 test_*.py or *_test.py 文件 中的所有以test前缀的方法。或者Test前缀类下的所有test 前缀的方法。不管是不是staticmethod and classmethods 官方文档 https://docs.pytest.org/en/8.2.x/explanation/goodpractices.html#test-discovery base…