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


    专栏导读

    🌸作者简介:花想云 ,在读本科生一枚,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"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 其中Get开头的成员函数用来获取私有成员的值;
    • ReadConfigFile:读取配置文件信息;

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

    #ifndef __MY_CONFIG__
    #define __MY_CONFIG__
    #include 
    #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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    在这里插入图片描述

  • 相关阅读:
    【web-攻击用户】(9.6.3)其他客户端注入攻击:客户端SQL注入、HTTP参数污染
    2024年云服务器ECS价格表出炉——阿里云
    将你的桌面变成一个雨滴窗口:关于两个有趣的应用的整合
    山西青年杂志山西青年杂志社山西青年编辑部2022年第22期目录
    Windows10 电脑上配置 Docker 环境
    强化学习:带MonteCarlo的Reinforce求解MountainCar问题
    SpringCloud微服务实战——搭建企业级开发框架(五十一):微服务安全加固—自定义Gateway拦截器实现防止SQL注入/XSS攻击
    IVI车载信息娱乐系统的网络安全注意事项
    前端下载文件重命名
    《信阳师范学院学报(自然科学版)》
  • 原文地址:https://blog.csdn.net/gllll_yu/article/details/134061496