【项目总结】C++ 云盘

news2025/1/13 17:47:05

项目介绍

本项目是一款分布式云存储软件,旨在提供强大的文件存储和共享功能。

因为要运行高并发量的访问,所以进行了服务器的集群,也就是要有多台web服务器,每台web服务器中部署相同的程序,为了让这几台web服务器的负载是均衡的,搭建了一个反向代理服务器,在反向代理服务器所对应的配置文件中平衡地给多个web分配任务

每台web服务器上部署了nginx,nginx可以解析http请求,nginx只能部署静态页面,可以在安装目录下将静态页面放到相应的地方。

nginx不能处理动态的页面请求,他只能处理http协议,所以运用了fastCGI,CGI即公共网关接口,其实质是运行在web服务器上的一段代码,这段代码就是被web服务器调用,用以处理一些请求,请求完之后将数据发送给web服务器,再由web服务器发还给客户端。如果单纯的采用CGI,则效率是比较低的,这样如果上传10个文件,它就会fork出10个子进程。所以采用了fastCGI,fastCGI致力于减少Web服务器与 CGI  之间互动的开销,从而使服务器 可以同时处理更多的Web请求 。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理。

因为nginx与fastCGI之间实际上是独立的,所以运用了一个第三方工具Spawn-fcgi,用于启动fastCGI程序。

因为该应用的主要功能就是文件存储,如果直接将上传的文件存储在web服务器上会不利于文件的管理,所以需要一个文件服务器。这里选用了fastDFS作为分布式文件系统,其可以提供文件的上传和下载功能,且fastDFS是分布式的,可以将存储节点布局在多台主机上,方便扩容。

MySQL中存储上传文件的信息(包括文件md5,文件的fild_id,下载的url,文件大小、文件类型、文件名、文件的引用计数)和 文件与用户对应的信息(文件所属用户、文件md5、文件创建时间、文件名、共享状态、文件下载量)以及 用户文件数量信息、共享文件信息等。

Redis中存储一些访问频率很高的数据,如token验证等。

上传文件

浏览器/客户端 通过nginx反向代理服务器连接到web服务器上,浏览器/客户端给web服务器发送对应的upload指令,并调用对应的cgi程序(upload-cgi),在upload-cgi中又会调用fastdfs的API,连接上fastdfs中的tracker,从而得到一个storage的ip和端口,通过这个ip和端口,web服务器将文件存储在这个storage的节点上。同时将fileID和存储节点的IP存储在数据库中。

上传文件的代码逻辑 

文件下载 

按理说,文件下载的流程是:

浏览器将下载指令发送给web服务器,web服务器无法处理该动态请求,所以将下载指令发给fastcgi,下载相关的cgi程序就去连接fastDFS的tracker,并进行询问“我要下载的文件在哪一个存储节点上面”,tracker经过查询后,将存储节点的IP和端口返回,然后下载相关的cgi程序再去与存储节点(storage)相连接,存储节点再将数据回发给web服务器,然后web服务器再将数据发给浏览器,浏览器才能显示下载的内容,是一个非常麻烦的过程。

1、浏览器访问web服务器

2、web服务器调用cgi程序

3、cgi程序访问tracker

4、tracker会提供storage的ip和端口

5、cgi程序去访问storage,下载数据

6、web服务器需要再次将数据发给浏览器

改进的下载流程

文件上传的时候,将文件的url保存到数据库中

浏览器访问web服务器,查询web服务器中的数据库

直接通过数据库中存储url 来访问storage上的文件 

需要在storage上部署一个nginx服务器    

下载文件的代码逻辑

 

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

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

相关文章

【VSCode 插件商城无法搜索到插件的解决方法】

背景 因为本地电脑安装的开发软件较多,导致电脑变得很卡,所有申请一个虚拟机作为开发机,安装完VScode之后发现无法搜索到插件,于是便想把本地电脑上VScode装好的插件复制到虚拟机上。 实现 VSCode 的插件存在 【C/用户/用户名/…

关于ubuntu设置sh文件开机自启动python3和sudo python3问题

关于ubuntu设置sh文件开机自启动python3和sudo python3问题 说明系统为 ubuntu22.04python是python3.10.12ros系统为ros2 humble 背景解决方法补充 说明 系统为 ubuntu22.04 python是python3.10.12 ros系统为ros2 humble 背景 将一个py文件设置为开机自启动,服…

如何对pdf文件进行压缩?

如何对pdf文件进行压缩?一般来说,PDF文件里面一般会包含大量的图像、文本和其他类型的独裁,这使得它们的文件大小相对于其他文档要大得多(其实主要是pdf文件里面包含的大量图片,尤其是高清拖)。由于pdf文件…

Tiny11:极限精简的Windows 11系统镜像,老旧电脑的福音(移除Windows11安装要求限制,且支持苹果ARM架构CPU,全版本资源下载)

文章目录 优点和适用场景系统下载系统版本说明系统安装Tiny11 设置安装简体中文语言方法Windows 11,作为微软最新一代操作系统,固然有其强大的功能和卓越的性能,但有时,更轻、更小、更快速的需求也在用户的考虑范围之内。这就是Tiny11存在的理由。Tiny11是基于Windows 11的…

【收藏】如何最快取得NISP二级和CISP

【收藏】如何最快取得NISP二级和CISP 👉今天小编来给大家讲解一下如何最快的取得NISP二级和CISP证书 ✅我们从如下几个方面为大家讲解: 🔺报名条件 🔺考试形式 🔺考试题型 🔺如何备考 🔺证书用途…

Wish下单支付教程,测评养号需要满足哪些技术要点?

Wish是2011年成立的一家高科技独角兽公司,有90%的卖家来自中国,也是北美和欧洲最大的移动电商平台。 它使用一种优化算法大规模获取数据,并快速了解如何为每个客户提供最相关的商品,让消费者在移动端便捷购物的同时享受购物的乐趣…

C# VS CS1752解决办法

代码报错: Severity Code Description Project File Line Suppression State Error CS1752 项目文件行抑制状态 错误cs1752无法嵌入互操作类型“ActUtlTypeClass”。 将引用的dll打开其属性 选择属性,将嵌入互操作类型改为false即可。

Java多线程篇(4)——wait/notify和park/unPark

文章目录 Object - wait/notifyobject.wait()object.notify() LockSupport - park/unparkLockSupport.park()LockSupport.unPark() Object - wait/notify object.wait() ObjectSynchronizer::wait 从这段代码可以得到两个信息 1:wait() 底层是对象锁(就…

You must install .NET Desktop Runtime to run this application

使用.Net6 写了个小程序,放到另一台机器上报这个错。 安装 x64的Desktop Runtime 安装 x86的Desktop Runtime 安装 x64的 .Net6 SDK 安装 x86的 .Net6 SDK 均无效,还是报这个错。 最后发现问题是因为生成目录里有一个 xxx.runtimeconfig.json 的文…

23年下考前须知-软考中级信息安全工程师

信息安全工程师主要涉及计算机信息安全方面,在计算机软硬件、网络、应用相关领域从事安全系统设计、安全产品开发、产品集成、信息系统安全检测与审计等方面工作,服务单位可以是国家机关、企事业单位及科研教学单位等。 一、考试报名时间 信安考试一年…

‘Xcode Unable to execute command: Segmentation fault: 11‘

概述, Xcode Unable to execute command: Segmentation fault: 11 解决方案, 添加: Build Setting -> Other Linker Flags -> -ld64 延伸, -ld64是什么, 在 Xcode 的 Build Setting 中,Other Linker Flags(其他链接器标志)用于向链…

c++ 多态的

#include <iostream> #include <string.h> using namespace std;//含有纯虚函数为抽象类&#xff0c;无法实例化 class AbstractDrinking { public://煮水virtual void Boil() 0;//冲泡virtual void Brew() 0;//导入杯子中virtual void PourInCup() 0;//加入辅料…

doxygen c++ 语法

c基本语法模板 以 /*! 开头, */ 结尾 /*!\关键字1\关键字2 */1 文件头部信息 /*! \file ClassA.h* \brief 文件说明 定义了类fatherA* \details This class is used to demonstrate a number of section commands.* \author John Doe* \author Jan Doe* \v…

C++11的一些新特性|右值引用|STL中的一些变化

文章目录 1、{}初始化 2、声明 2.1auto 2.2、decltype 2.3、nullptr 2.4.范围for循环 3、STL中的一些新变化 3.1.新容器 3.2容器中的一些新方法 4.右值引用和移动语义 左值引用和右值引用 左值引用的短板&#xff1a; 右值引用使用场景和意义&#xff1a; move的作…

干货:数据仓库基础知识(全)

1、什么是数据仓库&#xff1f; 权威定义&#xff1a;数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。 1&#xff09;数据仓库是用于支持决策、面向分析型数据处理&#xff1b; 2&#xff09;对多个异构的数据源有效集…

【分享】Word文档如何批量转换成PDF?

Word格式比较容易编辑&#xff0c;是工作中经常用到的文档工具&#xff0c;有时候为了避免文档在传送中出现乱码&#xff0c;或者防止被随意更改&#xff0c;很多人会把Word文档转换成PDF&#xff0c;那Word文档要怎样转成PDF呢&#xff1f;如果Word文档很多&#xff0c;有没有…

两种高效的事件处理模式:Reactor模式与Proactor模式

1.Reactor模式 一般使用同步IO模型实现 &#xff08;1&#xff09;Reactor 负责监听和分发事件&#xff0c;事件类型包含连接事件、读写事件&#xff1b; &#xff08;2&#xff09;处理资源池负责处理事件&#xff0c;如 read -> 业务逻辑 -> send&#xff1b; 使用同…

three.js加载gltf文件过程以及遇到的问题

说明&#xff1a;在vue项目中使用的threejs; 刚开始&#xff0c;我是从网上下载的gltf文件&#xff0c;将.gltf 文件放在了src/assets/xxx.gltf , 对gltf格式的文件并不了解&#xff0c;使用如下方式加载gltf文件时&#xff0c; // 创建gltf加载器对象 const loader new G…

[RF学习记录][参数读取]从yaml文件读取参数变量

robotframework支持从yaml文件读取变量&#xff0c;对于比较多的参数&#xff0c;可以在yaml文件中定义好&#xff0c;在robot脚本中引用 1、定义yaml文件 文件内容如下&#xff0c;注意&#xff0c;变量和变量值之间要以4个字符分开 yaml_demo_name: tester traing_gpt_…

GC1262R/S 国产芯片,具有高效的直接 PWM 控制方式,它可以控制无刷直流电机转速,可替代APX9262R/茂达

GC1262R/S 是单线圈无刷直流电机的 电机驱动器。 具有高效的直接 PWM 控制方式&#xff0c;它可以控制无刷直流电机转速。它集成了最低速度限制模式、可调速度 斜率控制模式、软启动模式、风扇转速计、 锁保护、自动重启、TSD、OCP 和噪声控制模 式&#xff0c;噪声控制模式根据…