【项目总结】C++ 云盘

【项目总结】C++ 云盘_第1张图片

项目介绍

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

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

【项目总结】C++ 云盘_第2张图片

上传文件的代码逻辑 

【项目总结】C++ 云盘_第3张图片

文件下载 

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

浏览器将下载指令发送给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服务器需要再次将数据发给浏览器

【项目总结】C++ 云盘_第4张图片

改进的下载流程

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

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

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

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

【项目总结】C++ 云盘_第5张图片

下载文件的代码逻辑

【项目总结】C++ 云盘_第6张图片

 

你可能感兴趣的:(路漫漫找工作,c++)