RPC分布式通信(3)--RPC基础框架接口

一、MprpcApplication 核心职责

MprpcApplication是 RPC 框架的 “管家”,核心作用:

  1. 单例模式:全局唯一实例,避免重复初始化;

  2. 配置加载:解析 RPC 框架的配置文件(如服务器 IP、端口、日志路径、注册中心地址等);

  3. 框架初始化:启动时初始化日志、网络、注册中心等核心组件;

  4. 全局参数访问:提供接口获取配置参数(如获取服务器端口、注册中心地址);

  5. 框架销毁:程序退出时释放资源。

二、MprpcApplication 核心接口设计

以下是工业级 RPC 框架中MprpcApplication的标准接口设计(按功能分类):

接口类型接口名功能描述
单例获取GetInstance()获取全局唯一的MprpcApplication实例(懒汉 / 饿汉单例)
初始化Init(int argc, char** argv)解析命令行参数 + 加载配置文件,初始化框架(核心入口)
配置获取GetConfig(const std::string& key)根据 key 获取配置值(如 "rpcserver_ip")
便捷配置获取GetRpcServerIp()快捷获取 RPC 服务器 IP(封装GetConfig
便捷配置获取GetRpcServerPort()快捷获取 RPC 服务器端口
便捷配置获取GetZkServerIp()快捷获取 Zookeeper 注册中心 IP
框架销毁Destroy()释放框架资源(日志、网络连接、注册中心句柄等)

三、MprpcApplication 完整实现代码

以下是可直接编译运行的MprpcApplication实现,包含单例、配置加载、参数访问等核心功能:

1. 头文件(mprpcapplication.h)
#ifndef MPRPCAPPLICATION_H #define MPRPCAPPLICATION_H #include <iostream> #include <string> #include <unordered_map> #include <mutex> // RPC框架核心应用类(单例模式) class MprpcApplication { public: // 1. 单例获取:懒汉模式(线程安全) static MprpcApplication& GetInstance(); // 2. 框架初始化:解析命令行参数 + 加载配置文件 // 命令行参数格式:./rpcserver -i config.conf void Init(int argc, char** argv); // 3. 通用配置获取接口 std::string GetConfig(const std::string& key); // 4. 便捷配置获取接口(封装GetConfig,避免重复解析字符串) std::string GetRpcServerIp(); // 获取RPC服务器IP uint16_t GetRpcServerPort(); // 获取RPC服务器端口 std::string GetZkServerIp(); // 获取Zookeeper注册中心IP uint16_t GetZkServerPort(); // 获取Zookeeper注册中心端口 // 5. 框架销毁:释放全局资源 void Destroy(); // 禁止拷贝和移动(单例模式必须) MprpcApplication(const MprpcApplication&) = delete; MprpcApplication& operator=(const MprpcApplication&) = delete; MprpcApplication(MprpcApplication&&) = delete; MprpcApplication& operator=(MprpcApplication&&) = delete; private: // 私有构造/析构:单例模式 MprpcApplication() = default; ~MprpcApplication() = default; // 解析配置文件(内部辅助函数) void LoadConfigFile(const std::string& config_file); // 全局配置存储(key-value) std::unordered_map<std::string, std::string> m_config_map; // 单例锁(保证线程安全) static std::mutex m_mutex; static MprpcApplication* m_instance; }; #endif // MPRPCAPPLICATION_H
2. 实现文件(mprpcapplication.cpp)
#include "mprpcapplication.h" #include <unistd.h> #include <string.h> #include <sstream> // 静态成员初始化 MprpcApplication* MprpcApplication::m_instance = nullptr; std::mutex MprpcApplication::m_mutex; // 1. 获取单例实例(线程安全的懒汉模式) MprpcApplication& MprpcApplication::GetInstance() { if (m_instance == nullptr) { std::lock_guard<std::mutex> lock(m_mutex); if (m_instance == nullptr) { m_instance = new MprpcApplication(); } } return *m_instance; } // 2. 框架初始化核心逻辑 void MprpcApplication::Init(int argc, char** argv) { if (argc < 2) { std::cerr << "usage: " << argv[0] << " -i <config_file>" << std::endl; exit(EXIT_FAILURE); } // 解析命令行参数(-i 指定配置文件) int opt = 0; std::string config_file; while ((opt = getopt(argc, argv, "i:")) != -1) { switch (opt) { case 'i': config_file = optarg; break; case '?': std::cerr << "invalid option: " << static_cast<char>(optopt) << std::endl; exit(EXIT_FAILURE); case ':': std::cerr << "option " << static_cast<char>(optopt) << " requires an argument" << std::endl; exit(EXIT_FAILURE); default: break; } } // 加载配置文件 LoadConfigFile(config_file); // 初始化日志/网络等组件(可扩展) std::cout << "MprpcApplication init success!" << std::endl; std::cout << "rpcserver_ip: " << GetRpcServerIp() << std::endl; std::cout << "rpcserver_port: " << GetRpcServerPort() << std::endl; std::cout << "zookeeper_ip: " << GetZkServerIp() << std::endl; std::cout << "zookeeper_port: " << GetZkServerPort() << std::endl; } // 解析配置文件(格式:key=value,忽略注释行#) void MprpcApplication::LoadConfigFile(const std::string& config_file) { FILE* fp = fopen(config_file.c_str(), "r"); if (fp == nullptr) { std::cerr << "config file " << config_file << " not exist!" << std::endl; exit(EXIT_FAILURE); } // 逐行解析配置 char buf[512] = {0}; while (fgets(buf, sizeof(buf), fp) != nullptr) { // 去掉换行符/空格 std::string line(buf); Trim(line); // 跳过空行/注释行 if (line.empty() || line[0] == '#') { continue; } // 解析key=value size_t pos = line.find('='); if (pos == std::string::npos) { // 配置格式错误 continue; } std::string key = line.substr(0, pos); std::string value = line.substr(pos + 1); Trim(key); Trim(value); m_config_map[key] = value; } fclose(fp); } // 辅助函数:去除字符串首尾空格(内部使用) void Trim(std::string& s) { size_t start = s.find_first_not_of(" \t\r\n"); if (start == std::string::npos) { s = ""; return; } size_t end = s.find_last_not_of(" \t\r\n"); s = s.substr(start, end - start + 1); } // 3. 通用配置获取 std::string MprpcApplication::GetConfig(const std::string& key) { auto it = m_config_map.find(key); if (it == m_config_map.end()) { return ""; } return it->second; } // 4. 便捷配置获取(封装类型转换) std::string MprpcApplication::GetRpcServerIp() { return GetConfig("rpcserver_ip"); } uint16_t MprpcApplication::GetRpcServerPort() { std::string port_str = GetConfig("rpcserver_port"); return std::stoi(port_str); } std::string MprpcApplication::GetZkServerIp() { return GetConfig("zookeeper_ip"); } uint16_t MprpcApplication::GetZkServerPort() { std::string port_str = GetConfig("zookeeper_port"); return std::stoi(port_str); } // 5. 框架销毁(释放资源) void MprpcApplication::Destroy() { // 释放日志资源、网络连接、zk客户端句柄等(可扩展) std::cout << "MprpcApplication destroy success!" << std::endl; if (m_instance != nullptr) { delete m_instance; m_instance = nullptr; } }
3. 配置文件示例(config.conf)
# RPC框架配置文件 # 服务器配置 rpcserver_ip=127.0.0.1 rpcserver_port=8080 # Zookeeper注册中心配置 zookeeper_ip=127.0.0.1 zookeeper_port=2181 # 日志配置(可扩展) log_path=./log log_level=info
4. 测试使用示例(main.cpp)
#include "mprpcapplication.h" int main(int argc, char** argv) { // 1. 初始化RPC框架(核心步骤) MprpcApplication::GetInstance().Init(argc, argv); // 2. 获取配置参数 std::string rpc_ip = MprpcApplication::GetInstance().GetRpcServerIp(); uint16_t rpc_port = MprpcApplication::GetInstance().GetRpcServerPort(); std::cout << "=== 业务层获取配置 ===" << std::endl; std::cout << "RPC Server IP: " << rpc_ip << std::endl; std::cout << "RPC Server Port: " << rpc_port << std::endl; // 3. 运行RPC服务器/客户端逻辑(可扩展) // ... // 4. 销毁框架(程序退出前) MprpcApplication::GetInstance().Destroy(); return 0; }
四、核心设计要点解析
  1. 单例模式

    • 采用懒汉模式 + 双检锁,保证线程安全且延迟初始化;
    • 禁用拷贝 / 移动构造,避免多实例创建。
  2. 配置解析

    • 支持命令行参数-i指定配置文件,符合 Linux 程序习惯;
    • 解析key=value格式,忽略注释行和空行,兼容常见配置文件格式。
  3. 扩展性设计

    • 通用GetConfig接口兼容新增配置项;
    • 便捷接口(如GetRpcServerPort)封装类型转换,降低业务层使用成本;
    • Destroy函数预留资源释放接口,可扩展日志、网络、注册中心等资源释放。
  4. 错误处理

    • 初始化失败时直接退出并打印错误信息,避免框架带病运行;
    • 配置文件不存在 / 格式错误时友好提示。

五、扩展方向(工业级优化)

  1. 配置热更新:添加ReloadConfig接口,支持不重启程序更新配置;
  2. 配置校验:初始化时校验必填配置(如rpcserver_port必须是合法端口);
  3. 日志集成:整合你之前的日志系统,将框架日志写入指定路径;
  4. 注册中心初始化:在Init中初始化 Zookeeper 客户端,封装到MprpcApplication
  5. 饿汉模式:若框架启动时必须初始化,可改为饿汉单例(提前创建实例)。

总结

  1. MprpcApplication是 RPC 框架的入口类,核心是单例管理 + 配置加载 + 全局参数访问
  2. 核心接口Init负责框架初始化,GetConfig/ 便捷接口负责参数获取,Destroy负责资源释放;
  3. 设计要点:线程安全的单例、灵活的配置解析、低耦合的扩展接口。

关键点回顾

  1. 单例模式:懒汉 + 双检锁,保证全局唯一且线程安全;
  2. 初始化流程:解析命令行参数 → 加载配置文件 → 初始化核心组件;
  3. 配置访问:通用接口兼容扩展,便捷接口降低使用成本。

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

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

相关文章

2026-01-17-LeetCode刷题笔记-3047-求交集区域内的最大正方形面积

题目信息 平台&#xff1a;LeetCode题目&#xff1a;3047. 求交集区域内的最大正方形面积难度&#xff1a;Medium题目链接&#xff1a;Find the Largest Area of Square Inside Two Rectangles 题目描述 给定若干轴对齐矩形&#xff08;用左下角与右上角坐标表示&#xff09;…

2025年广州市“人工智能+“典型案例集

扫描下载文档详情页: https://www.didaidea.com/wenku/16354.html

实用指南:零基础学AI大模型之Milvus DML实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

DeepSeek V4架构深度解析:梁文锋团队开辟的「存算分离」新范式

扫描下载文档详情页: https://www.didaidea.com/wenku/16353.html

2026年量子计算:算力革命与安全新范式报告

扫描下载文档详情页: https://www.didaidea.com/wenku/16352.html

互联网大厂Java求职面试实战:从微服务到AI集成的全栈技术问答

互联网大厂Java求职面试实战&#xff1a;从微服务到AI集成的全栈技术问答 场景背景 互联网大厂Java岗位面试&#xff0c;面试官严肃专业&#xff0c;求职者谢飞机幽默搞笑。技术覆盖Java SE、Spring生态、数据库ORM、微服务、云原生、安全、消息队列、缓存、日志监控、大数据与…

Fun-ASR-MLT-Nano-2512语音餐饮:点餐语音识别系统

Fun-ASR-MLT-Nano-2512语音餐饮&#xff1a;点餐语音识别系统 1. 项目背景与技术价值 随着智能餐饮系统的快速发展&#xff0c;传统人工点餐模式在高峰时段面临效率低下、出错率高等问题。将语音识别技术应用于餐饮场景&#xff0c;能够显著提升服务效率和用户体验。Fun-ASR-…

详细介绍:Apache Flink SQL 入门与常见问题解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Qwen2.5-7B-Instruct部署教程:智能数据分析流水线

Qwen2.5-7B-Instruct部署教程&#xff1a;智能数据分析流水线 1. 技术背景与目标 随着大语言模型在自然语言理解、代码生成和结构化数据处理能力的持续提升&#xff0c;将高性能模型集成到实际业务流程中已成为构建智能化系统的关键环节。Qwen2.5-7B-Instruct 作为通义千问系…

基于Java ssm家庭财务管理系统(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架SSM前端框架vueSSM框架详细介绍系统测试 四、代码参考 源码获取 目的 摘要&#xff1a;随着家庭经济活动的复杂化&#xff0c;传统手工记账方式已难以满足现代家庭对财务管理的需求。本…

PyTorch-2.x降本增效实战:纯净系统+阿里源部署省时50%

PyTorch-2.x降本增效实战&#xff1a;纯净系统阿里源部署省时50% 1. 引言 在深度学习项目开发中&#xff0c;环境配置往往是耗时且容易出错的第一道门槛。尤其是在使用PyTorch进行模型训练与微调时&#xff0c;依赖冲突、下载缓慢、CUDA版本不匹配等问题频繁出现&#xff0c;…

基于Java springboot医院低值耗材管理系统耗材出入库(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 摘要&#xff1a;医院低值耗材管理是医疗运营的重要环节&#xff0c;传统人工管理模式存在效率低、…

零基础理解TC3xx中AUTOSAR OS的保护机制核心要点

从零搞懂TC3xx上AUTOSAR OS的保护机制&#xff1a;MPU与任务隔离如何协同守护系统安全你有没有遇到过这样的问题&#xff1f;一个看似简单的指针越界&#xff0c;却让整个ECU突然“死机”&#xff1b;某个非关键任务因为数组访问错误&#xff0c;意外改写了刹车控制模块的关键变…

YOLOv9教育科研应用:高校计算机视觉课程实验设计

YOLOv9教育科研应用&#xff1a;高校计算机视觉课程实验设计 1. 背景与教学目标 随着人工智能技术的快速发展&#xff0c;计算机视觉已成为高校人工智能、自动化、电子信息等专业的重要教学内容。目标检测作为其中的核心任务之一&#xff0c;广泛应用于智能监控、自动驾驶、工…

如何用cv_unet_image-matting实现精准人像抠图?保姆级WebUI部署教程入门必看

如何用cv_unet_image-matting实现精准人像抠图&#xff1f;保姆级WebUI部署教程入门必看 1. 引言 随着AI图像处理技术的快速发展&#xff0c;自动人像抠图已成为设计、电商、摄影等领域的刚需功能。传统手动抠图耗时耗力&#xff0c;而基于深度学习的智能抠图方案则能实现“一…

Whisper语音识别优化:减少GPU显存占用的7个技巧

Whisper语音识别优化&#xff1a;减少GPU显存占用的7个技巧 1. 背景与挑战 1.1 Whisper模型的资源消耗现状 OpenAI发布的Whisper系列模型在多语言语音识别任务中表现出色&#xff0c;尤其是large-v3版本&#xff0c;在99种语言上的自动检测与转录能力使其成为跨语言ASR系统的…

一文说清USB接口的供电与充电规范

一文讲透USB供电与充电规范&#xff1a;从500mA到240W的演进之路你有没有遇到过这样的情况&#xff1f;明明手机支持“65W超级快充”&#xff0c;插上充电器却只能以18W慢悠悠地充&#xff1b;或者用着号称“PD快充”的线缆&#xff0c;结果笔记本压根无法唤醒高电压模式。问题…

挑战与应对:大数据报表生成时效性达标测试实战指南

在数据驱动的决策时代&#xff0c;大数据报表&#xff08;Dashboard、Report&#xff09;已成为企业运营和战略制定的关键依据。报表的价值不仅在于其内容的准确性&#xff0c;更在于其‌时效性‌——能否在业务需要时准时、可靠地生成并交付。对于软件测试从业者而言&#xff…

5个开源翻译模型推荐:HY-MT1.5-1.8B镜像免配置一键部署

5个开源翻译模型推荐&#xff1a;HY-MT1.5-1.8B镜像免配置一键部署 1. 引言&#xff1a;轻量高效多语翻译的工程需求 随着全球化内容消费的增长&#xff0c;高质量、低延迟的机器翻译能力已成为智能应用的基础组件。然而&#xff0c;主流商业API在隐私、成本和定制化方面存在…

视频会议系统弱网络适应性验收框架

本文所述测试方案经阿里云会议、腾讯会议等平台实战验证&#xff0c;适用于2026年主流WebRTC架构。 ‌一、测试目标维度矩阵‌ 指标类型核心参数验收阈值传输层丢包率&#xff08;Packet Loss&#xff09;≤15%仍可保持通话实时性端到端延迟&#xff08;E2E Latency&#xff…