FastDFS实现上传图片

一、传统方式:

可以将图片放在工程里面,比如说在webapp下创建一个Images文件夹,访问的时候直接访问图片的网址:localhost:8080/工程名/Images/a.jpg


传统方式的问题:且不说分布式,在集群环境中(至少2个tomcat)

采用nginx做负载均衡服务器(轮询策略)。

问题:用户第一次请求上传图片tomcat1来处理,若用户想查看是否上传成功,nginx则将请求交给tomcat2处理,去tomcat2的webapp/Images/下寻找,此时则找不到。

解决办法:

搭建一个图片服务器,专门保存图片。

一旦上传图片的时候,不把图片保存在当前的服务器下面,我们保存在图片服务器上面 。当访问图片的时候,直接使用http去找图片服务器。那么图片服务器上必须有一个http服务器,tomcat可以做(本身就是http服务器,但是访问静态资源不是他的强项,它主要用来做应用服务器解析jsp处理servlet),Apache可以做,不过现在越来越多的人使用nginx来访问静态资源

新的问题:存储容量问题,总有一天这台服务器的内存被使用完了或者某一天这台服务器宕机了,因此图片服务器也应该实现高可用

解决办法:使用图片服务器FastDFs(分布式文件系统),国产软件!!!

可以实现存储空间的横向扩展,可以实现服务器的高可用、高并发。支持每个节点有备份机。

二、图片服务器FastDFs

1、什么是FastDFs

FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

2、FastDFs的架构

FastDFS架构包括 Tracker serverStorage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。

Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。

Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

服务端两个角色:

Tracker:管理集群,tracker也可以实现集群。每个tracker节点地位平等。

收集Storage集群的状态。也就是告诉客户端你将图片上传到哪一台服务器上,或者告诉客户端去哪一台服务器上访问图片。实际上Tracker和Storage之间是实时通信的,每个Storage集群中的每台服务器都要连接Tracker集群,告诉Tracker集群自己的状态,比如说健康状态、容量以及负载情况,都会定期向Tracker汇报。 

 

Storage:实际保存文件。Storage分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。

3、文件上传的流程


客户端上传文件后存储服务器文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

·组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。不同的组保存的数据是不一样的。

·虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。一般可以理解为一个服务器存储完了之后可以加硬盘,加硬盘之后就加了一个新的目录,这时候就可以是M01...

·数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。从00到FF。

·文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

4、文件的下载流程


5、最简单的FastDFs架构


通过nginx、nginx与FasfDFs的插件来访问图片

6、图片服务器的使用

(1)、向工程中添加jar包(导入maven工程)

        <dependency>
<groupId>fastdfs_client</groupId>
<artifactId>fastdfs_client</artifactId>
<version>1.25</version>
</dependency>

(2)、创建一个配置文件。配置tracker服务器地址tracker_server=xxx

(3)、加载配置文件ClientGlobal.init(path);

(4)、创建一个TrackerClient对象

(5)、使用TrackerClient对象获得trackerserver对象

(6)、创建一个StorageServer的引用null就可以

(7)、创建一个StorageClient对象。trackerserver、StorageServer两个参数

(8)、使用StorageClient对象上传文件,返回值为文件ID

猜你喜欢

转载自blog.csdn.net/AUBREY_CR7/article/details/80716331