【项目总结】C++ 云盘

本文介绍了分布式云存储项目的架构,包括服务器集群、负载均衡的实现、Nginx与fastCGI的协作、FastDFS文件存储、MySQL数据库管理和Redis缓存的使用。重点讲述了文件上传和下载流程的改进,通过数据库存储URL简化下载过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目介绍

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

因为要运行高并发量的访问,所以进行了服务器的集群,也就是要有多台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服务器    

下载文件的代码逻辑

 

文件内包含 Apache C++ 、Standard Library、ASL、Boost、BDE、Cinder、Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。 Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。 EASTL :EA-STL公共部分。 ffead-cpp :企业应用程序开发框架。 Folly:由Facebook开发和使用的开源C++库。 JUCE :包罗万象的C++类库,用于开发跨平台软件。 libPhenom:用于构建高性能和高度可扩展性系统的事件框架。 LibSourcey :用于实时的视频流和高性能网络应用程序的C++11 evented IO。 LibU : C语言写的多平台工具库。 Loki :C++库的设计,包括常见的设计模式和习语的实现。 MiLi :只含头文件的小型C++库。 openFrameworks :开发C++工具包,用于创意性编码。 Qt :跨平台的应用程序和用户界面框架。 Reason :跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。 ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。 STLport:是STL具有代表性的版本。 STXXL:用于额外的大型数据集的标准模板库。 Ultimate++ :C++跨平台快速应用程序开发框架。 Windows Template Library:用于开发Windows应用程序和UI组件的C++库。 Yomm11 :C++11的开放multi-methods。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值