C++项目——云备份-④-服务端配置信息模块设计与实现

news2024/11/20 15:30:54

文章目录

  • 专栏导读
  • 1.系统配置信息设计
  • 2.系统配置信息实现
  • 3.配置文件加载类设计(单例模式)
  • 4.配置文件加载类实现与整理

专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 C++项目——云备份

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法Linux
🌸项目Gitee链接:https://gitee.com/li-yuanjiu/cloud-backup

在这里插入图片描述

1.系统配置信息设计

我们将程序运行中用到的一些关键信息保存到配置文件中,这样可以使程序的运行更加灵活。

这样做的好处是,未来如果我们想要修改一些关键信息,不需要去源文件里修改,避免了文件重新编译等

配置文件中包含以下配置信息:

  • 热点判断时间:决定热点文件隔多长时间会被判定为非热点文件;

  • 文件下载的url前缀路径:用于表示客户端的请求是一个下载请求;

    • 例如当用户发来一个备份列表查看请求listshow,我们如何判断这个请求不是一个listshow的文件下载请求。此时我们可以为下载请求添加一个前缀路径,例如/download/listshow,那么就认为它是一个下载请求
  • 压缩包后缀名:约定一个压缩包命名规则,例如在原文件后面加上.lz表示该文件的压缩包名称;

  • 上传文件存放路径:决定上传文件之后,该文件实际存储在服务器的何处;

  • 压缩包存放路径:决定压缩后的文件存储在何处;

  • 服务端备份信息存放文件:服务端记录的备份文件信息的持久化存储;

  • 服务器访问 IP 地址

  • 服务器访问端口

2.系统配置信息实现

// cloud.conf
{
    "hot_time" : 30,
    "server_port" : 9090,
    "server_ip" : "0.0.0.0",
    "download_prefix" : "/download/",
    "packfile_suffix" : ".lz",
    "pack_dir" : "./packdir/",
    "back_dir" : "./backdir/",
    "backup_file" : "./cloud.dat"
}

3.配置文件加载类设计(单例模式)

使用单例模式管理系统配置信息,能够让配置信息的管理控制更加统一灵活。该类的设计我们将使用单例模式中的懒汉模式,即在使用时创建对象。

类中包含以下成员:

    class Config
    {
    public:
        static Config* GetInstance();
        int _hot_time; // 热点判断时间
        int _server_port; // 服务器访问端口
        std::string _server_ip; // 服务器访问IP
        std::string _download_prefix; // 文件下载前缀路径
        std::string _packfile_suffix; // 压缩包后缀名
        std::string _pack_dir; // 压缩包存放路径
        std::string _back_dir; // 备份文件存放路径
        std::string _backup_file; // 备份信息存放文件
    private:
        Config(); // 构造函数私有化
		bool ReadConfigFile();
    private:
        int _hot_time;
        int _server_port;
        std::string _server_ip;
        std::string _download_prefix;
        std::string _packfile_suffix;
        std::string _pack_dir;
        std::string _back_dir;
        std::string _backup_file;
        static Config* _instance;
        static std::mutex _mutex;
    };
    Config* Config::_instance = nullptr;
    std::mutex Config::_mutex;
  • 其中Get开头的成员函数用来获取私有成员的值;
  • ReadConfigFile:读取配置文件信息;

4.配置文件加载类实现与整理

#ifndef __MY_CONFIG__
#define __MY_CONFIG__
#include <mutex>
#include "util.hpp"

namespace cloud
{
#define CONFIG_FILE "./cloud.conf" // 配置文件路径
    class Config
    {
    private:
        Config() { ReadConfigFile(); }
        static Config* _instance;
        static std::mutex _mutex;
    private:
        int _hot_time; // 热点判断时间
        int _server_port; // 服务器访问端口
        std::string _server_ip; // 服务器访问IP
        std::string _download_prefix; // 文件下载前缀路径
        std::string _packfile_suffix; // 压缩包后缀名
        std::string _pack_dir; // 压缩包存放路径
        std::string _back_dir; // 备份文件存放路径
        std::string _backup_file; // 备份信息存放文件
        bool ReadConfigFile()
        {
            FileUtil fu(CONFIG_FILE);
            std::string body;
            if(fu.GetContent(&body) == false)
            {
                std::cout << "load config file failed!" << std::endl;
                return false;
            }
            Json::Value root;
            if(JsonUtil::Unserialize(body, &root) == false)
            {
                std::cout << "parse config file failed!" << std::endl;
                return false;
            }
            _hot_time = root["hot_time"].asInt();
            _server_port = root["server_port"].asInt();
            _server_ip = root["server_ip"].asString();
            _download_prefix = root["download_prefix"].asString();
            _packfile_suffix = root["packfile_suffix"].asString();
            _pack_dir = root["pack_dir"].asString();
            _back_dir = root["back_dir"].asString();
            _backup_file = root["backup_file"].asString();
        }
    public:
        static Config* GetInstance()
        {
            if(_instance == nullptr)
            {
                _mutex.lock();
                if(_instance == nullptr)
                {
                    _instance = new Config();
                }
                _mutex.unlock();
            }
            return _instance;
        }
        int GetHotTime()
        {
            return _hot_time;
        }
        int GetServerPort()
        {
            return _server_port;
        }
        std::string GetSeverIp()
        {
            return _server_ip;
        }
        std::string GetDownloadPrefix()
        {
            return _download_prefix;
        }
        std::string GetPackFileSuffix()
        {
            return _packfile_suffix;
        }
        std::string GetPackDir()
        {
            return _pack_dir;
        }
        std::string GetBackDir()
        {
            return _back_dir;
        }
        std::string GetBackupFile()
        {
            return _backup_file;
        }
    };
    Config* Config::_instance = nullptr;
    std::mutex Config::_mutex;
}
#endif

在这里插入图片描述

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

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

相关文章

ps 图框选择工具

上文 PS 图层剪贴蒙版使用方法 我们为了能够开展 图框工具 的学习 先学习了剪贴蒙版 那么 我们现在就可以开始接触图框工具了 我们先在左侧菜单中选中图框工具 上方属性里面 有一个 矩形 圆形 这就是选择的区域形状 很好理解 这里 我们先选择 矩形 这里 我先将多余的两个图层…

GalaxyBase分布式集群关闭后启动

文章目录 1 环境2 按照官方文档操作3 启动操作3.1 将主节点的所有容器服务启动3.2 将从节点的容器graph服务启动 4 官方文档的操作仍然报错5 关于docker命令 前面由于服务器关机下电&#xff0c;导致重启&#xff0c;遇见很多问题&#xff0c;官方文档的参考并不是很清晰明确&a…

APP破解去广告

1.修改图标和名称 名称直接改 找到图标在进去把他替换掉 2.修改app包名实现分身 修改包名实现app分身_Tian翊的博客-CSDN博客 3.修改资源去广告 安卓逆向006之修改APK资源去广告_修改安装包去除app内广告-CSDN博客 打开模拟器后在cmd命令行输入adb devices连接上 在模拟器中…

基于Java的在线教育网站管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

ROS学习记录2018.7.10

ROS学习记录2018.7.10 1.ROS基础了解 开源机器人操作系统ROS&#xff08;robot operation system&#xff09; 分级&#xff1a; 1.计算图集&#xff08;一种网络结构&#xff09; 1.节点&#xff1a;执行运算的进程&#xff08;做基础处理的单元&#xff09;2.消息&#x…

业务架构、应用架构、技术架构、数据架构

架构规划的重要性 如果没有进行合理的架构规划&#xff0c;将会引发一系列的问题。为了避免这些问题的发生&#xff0c;企业需要进行业务架构、应用架构、技术架构和数据架构的全面规划和设计&#xff0c;以构建一个清晰、可持续发展的企业架构。 https://www.zhihu.com/que…

【Vue3-Flask-BS架构Web应用】实践笔记1-使用一个bat脚本自动化完整部署环境

前言 近年来&#xff0c;Web开发已经成为计算机科学领域中最热门和多产的领域之一。Python和Vue.js是两个备受欢迎的工具&#xff0c;用于构建现代Web应用程序。在本教程中&#xff0c;我们将探索如何使用这两个工具来创建一个完整的Web项目。我们将完成从安装Python和Vue.js到…

柏林自由大学物理学家发布测试量子计算机质量的新方法

​&#xff08;图片来源&#xff1a;网络&#xff09; 量子技术&#xff0c;尤其是量子计算机&#xff0c;将促进未来的技术发展。科学家认为&#xff0c;量子计算机将帮助他们解决即使是最快的超级计算机也无法处理的问题。大型国际IT公司以及美国、中国等一直在为这项技术的开…

适用于 Mac 或 Windows 的 4 种最佳 JPEG/PNG图片 恢复软件

您的计算机或外部存储驱动器上很可能有大量 JPEG /PNG图片照片&#xff0c;但不知何故&#xff0c;您意识到一些重要的 JPEG /PNG图片文件丢失或被删除&#xff0c;它们对您来说意义重大&#xff0c;您想要找回它们. 4 种最佳 JPEG/PNG图片 恢复软件 要成功执行 JPEG /PNG图片…

性能测试的指南:测试类型、性能测试步骤、最佳实践等!

近期公司为了节省成本搞了一波机房迁移&#xff0c;整合了一些南美部署架构。有一些上google云和有些下阿里云等大的调整。 在做机房迁移项目当中就需要思考如何进行性能测试&#xff0c;这种大的机房迁移SRE&#xff08;运维&#xff09;会针对组件会做一些单组件的性能测试&a…

Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学

一&#xff0c;操作系统介绍 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调…

2023-10-26 用C语言实现一个大整数加法

点击 <C 语言编程核心突破> 快速C语言入门 用C语言实现一个大整数加法 前言一、思路和代码设计数字对齐:字符对齐: 二、代码总结 前言 要解决问题: 实现大整数加法 想到的思路: 用字符代替数字, 逐个计算, 过10进位. 其它的补充: 同样思路可以解决减法, 乘法, 但除法…

ubuntu安装idea

idea下载 选择第一个.tar.gz(Linux)下载 解压后 进入bin目录在终端运行./idea.sh即可

数据安全法开始正式实施的时间是什么时候?主要目的是什么?

大数据时代&#xff0c;数据生成贯穿于经济活动的方方面面&#xff0c;贯穿于企业&#xff0c;贯穿于民生。数据是国家基础性战略资源&#xff0c;没有数据安全就没有国家安全。所以保障数据安全至关重要。那你知道数据安全法开始正式实施的时间是什么时候&#xff1f;主要目的…

眨个眼就学会了PixiJS

本文简介 带尬猴&#xff0c;我是德育处主任 当今的Web开发中&#xff0c;图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎&#xff0c;已经成为了许多开发者的首选&#xff08;我吹的&#xff09;。本文将为工友们介绍PixiJS的…

完美解决configure: error: APR not found. Please read the documentation.

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; ./configure 出现如下问题&#xff1a; configure: error: APR not found. Please read the documentation. 二、原因&#xff1a; 配置&#xff1a;错误&#xff1a;找不…

火山引擎DataLeap背后的支持者 - 工作流编排调度系统FlowX

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 背景介绍 业务场景 在日常工作中&#xff0c;我们时不时需要对某些逻辑进行重复调度&#xff0c;这时我们就需要一个调度系统。根据不同的调度需求&#xff0c;可…

【Qt之QtConcurrent】描述及使用

描述 QtConcurrent是一个Qt库中的模块&#xff0c;用于实现多线程并发编程。它提供了一些高级API&#xff0c;使得在多核处理器上并行执行代码变得更加容易。 示例&#xff1a; 使用的话&#xff0c; 需要在pro文件中添加&#xff1a;QT concurrent模块。 #include <QC…

微信公众号分销商城源码系统+多元商家+收银台 带完整的搭建教程

给大家推荐一款微信公众号分销商城源码系统&#xff0c;这是一个全新三级分销商城&#xff0c;功能十分丰富。一起来看看你吧。 微信公众号分销商城的功能&#xff1a; 1.商品展示和推广&#xff1a;商家可以在商城中展示商品信息&#xff0c;包括商品名称、价格、库存等&#…