# mycloud **Repository Path**: adce9/mycloud ## Basic Information - **Project Name**: mycloud - **Description**: 自实现小型云计算云存储 - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-05-09 - **Last Updated**: 2022-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: 项目 ## README # README 1. 因为线程池和线程安全队列是模板,鉴于C++模板的特殊编译方式,将.cpp文件和.h文件合并为.hpp文件,这也是模板编译的标准方式之一。 2. libstdc++库为6.0.25,可能还需要安装一些比较新版本的库. 3. 数据库连接使用MySQL++第三方库. 4. 数据库连接池加载的时候会从db.conf文件中读取链接必要的信息,因为是在数据库连接池的构造函数中读取配置文件,按照编程规范,构造函数不应该报错,所以应确保db.conf文件的正确性. 5. 连接功能理论上已经完毕,但是没有编译调试,因为要做go的项目,而go web环境对我来说是陌生的,到六月中旬之前我可能每天都要在go了,这个项目就暂停到六月中旬之后. 6. 根据自己的环境可能需要重写makefile # 有想法但是待完善的功能 1. 客户端用Qt封装成可视化界面. 2. 代理服务器使用Redis做一次缓存,使用redisplusplus或hiredis第三方库. 3. 代理服务器和服务器应作为守护进程. 4. 应把show_info()函数修改为日志输出. # 知识点和将要涉及的知识点 1. 总体分为 云开放给客户端的接口,代理服务器,两台主服务器,两台数据库 四部分,因为是开放接口,所以应归结为Paas类型。 2. 数据库配置主从复制 3. 数据库分别预先建立主库连接池和从库连接池(封装在一个类中),做到读写分离 4. 主服务器使用线程安全队列(智能指针,C++互斥量,C++条件变量)存储任务(function类) 5. 主服务器只负责与代理服务器的通信,不负责与客户端的通信 6. 主服务器两个线程,一个线程使用select非阻塞模型监听serversocket(代理服务器是否有报文发来),另一个线程负责循环往线程池里submit任务。两个线程使用互斥量和条件变量通信和保证同步 7. 线程池和数据库连接池保证单例 7. 代理服务器对下负责客户端的连接,对上负责两台服务器的连接。 8. 对listen套接字、客户端套接字和服务器套接字使用epoll模型,因为不保存客户端与服务器的一对一信息,所以代理服务器发送给主服务器的报文拼接了对应客户端的套接字,为了在代理服务器收到主服务器的回复后,能响应的发送给对应的客户端。 9. 代理服务器记录每台主服务器已经在处理的逻辑客户数量,并作平衡调整(模拟负载均衡) 10. 客户端调用adce_cloud类接口,请求具体的功能,adce_cloud类保证单例并设置引用计数。 ## 客户端 1. socket通信 2. 单例模式 3. Qt框架(待完成) ## 代理服务器 1. epoll非阻塞模型 2. socket通信 3. Redis(待完成) ## 服务器 1. select非阻塞模型 2. C++11线程池 3. 线程安全队列模板 4. MySQL数据库连接池 5. 单例模式 6. 文件目录解析(待开发功能模块的知识点)