# syb-storage-server **Repository Path**: syb4750/syb-storage-server ## Basic Information - **Project Name**: syb-storage-server - **Description**: 云存储服务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-18 - **Last Updated**: 2025-08-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于异步日志系统的云存储服务 本项目分为日志部分和存储部分。 日志部分通过多线程的方式异步并发写日志,防止写日志时阻塞外部业务逻辑。可以设置输出日志到控制台、文件以及按照文件大小滚动文件中,文件大小可配置。同时实现了一个备份日志服务器,将重要日志备份到远程服务器上,防止crush后无法debug。 存储部分是一个类似网盘的项目,支持浅度存储和深度存储,使用bundle库进行文件压缩。在web浏览器端上传和下载文件。 ## 异步日志系统 ![log](picture/log.png) ### AsyncBuffer 异步缓存区模块 供AsyncWorker使用,采用双缓冲设计,分为消费者缓冲区和生产者缓冲区,当生产者缓冲区有数据后则触发缓冲区交换,实际交换三个成员变量,而非真的交换缓存区数据。 ### AsyncLogger 异步日志器模块 包含异步日志器和日志器创建者。日志器对各个日志等级的日志消息进行格式化,并最终调用异步工作者进行实际的写日志。这里使用了建造者模式,方便后续做扩展其他特性的日志器。 ### AsyncWorker 异步工作者模块 异步线程,日志器创建后就会启动。Buffer中没有数据时会阻塞等待,有数据时将生产者Buffer和消费者Buffer对调,然后将消费者Buffer中的数据刷新到文件 。包含两种模式,非安全模式不限制缓冲区增长,安全模式下缓冲区不足时会阻塞等待其他日志被消费掉 ### ThreadPool 在备份重要日志的时候使用池中的线程进行网络IO。 ## 云存储服务 ![storage](picture/storage.png) ### libevent实现http服务流程 + 初始化libevent ``` cpp struct event_base *base = event_base_new(); ``` + 创建HTTP服务器 ``` cpp struct evhttp *httpd = evhttp_new(base); ``` + 绑定端口和地址 ``` cpp if (evhttp_bind_socket(httpd, "0.0.0.0", _server_port) != 0) { LOG_FATAL("evhttp_bind_socket failed!"); return false; } ``` + 设置请求回调 ``` cpp evhttp_set_gencb(httpd, GenHandler, (void*)_data_manager); ``` + 进入事件循环 ``` cpp event_base_dispatch(base); ``` + 清理资源 ``` cpp evhttp_free(httpd); event_base_free(base); ``` ### DataManager 数据管理模块 文件上传后会生成Storage.data文件。其中包含了文件最后一次访问时间,大小,修改时间,文件的存储路径,url下载路径。 ### Service 服务端http通信 前端使用base64编码进行编码,后端进行解码获取文件名。当用户刷新前端页面时,服务器会将已上传的文件列表添加到html中组织成最终返回给浏览器的html代码。