fastdfs 测试客户端_「Java」 - SpringBoot & FastDFS

一、FastDFS

FastDFS是一个开源的轻量级分布式文件系统,它解决了大数据量存储和负载均衡等问题,特别适合以中小文件(建议范围:4 KB < file_size < 500 MB)为载体的在线服务,例如网盘、图床、广告和应用下载等业务的存储服务。

FastDFS由C语言开发,支持Linux、FreeBSD等UNIX系统类Google FS,不是通用的文件系统,只能通过专用API访问,目前提供了C、Java和PHP API。为互联网应用量身定做,解决了大容量文件存储问题,追求高性能和高扩展性,FastDFS可以看做是基于文件的Key-Value Pair存储系统,称作分布式文件存储服务会更合适。

A、FastDFS特点

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件
  • 存储服务器上可以保存文件属性(meta-data)V2.0 网络通信采用libevent,高性能支持大并发访问

B、FastDFS相关概念

FastDFS服务端有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  • Tracker Server:跟踪服务器。主要做调度工作,起负载均衡的作用,在内存记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的Master更为精简,不记录文件索引信息,占用的内存量很少。
  • Storage Server:存储服务器(又称存储节点或数据服务器)。文件和文件属性(Meta Data)都保存到存储服务器上,Storage Server直接利用OS的文件系统调用管理文件。
  • Client:客户端。作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,如upload、download、append、delete等,以客户端库的方式提供给用户使用。

C、FastDFS运行机制

82e446c7f50898638e12ba8dc104c016.png

Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过Tracker来分配资源;客户端一般可以使用Ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷与卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

D、上传机制

首先客户端请求Tracker服务获取到存储服务器的IP地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。

ca5f750ac62bb97023bbb5662b0dcc2e.png

E、下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的IP地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

483580d55e2eb18009cf99a599c17fb2.png

二、FastDFS安装

A、运行环境及相关软件

  • CentOS release 6.10 (Final) x86_64
  • fastdfs-5.11
  • nginx-1.15.12
  • fastdfs-nginx-module_v1.20
  • libfastcommon_v1.40

服务器IP-10.255.242.129,搭建单机单点FastDFS。

33192ffc2e125f32c5e8b8e21aa31ede.png

B、安装libfastcommon

libfastcommon是FastDFS的一个公共库,在安装FastDFS之前要先安装这个库。

# 下载并且解压
wget https://github.com/happyfish100/libfastcommon/archive/master.zip -O libfastcommon-master.zip
unzip master.zip 

B、安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V5.11.zip
unzip V5.11.zip
./make.sh
./make.sh install

C、新建目录作为FastDFS文件存储目录

mkdir -p /data01/fastdfs

D、配置

经过步骤B,FastDFS已经成功安装,配置文件放置在/etc/fdfs目录下,可执行文件放置在/usr/bin下。

cd /etc/fdfs
cp tracker.conf.sample tracker.conf
cp storage.conf.sample storage.conf
cp client.conf.sample client.conf
mv *.sample ./sample/

E、启动tracker与storage

cd /usr/bin
./fdfs_trackerd /etc/fdfs/tracker.conf restart
./fdfs_storaged /etc/fdfs/storage.conf restart

启动成功后,查看/data01/fastdfs目录,可以看到data、logs子目录,data目录中已经具有了文件存储目录结构。

6145f9edf28e3f80a80409b253cd828f.png

F、配置client

cd /etc/fdfs
vim client.conf
    

G、测试client上传

cd /usr/bin
./fdfs_upload_file /etc/fdfs/client.conf /var/www/soft/img.png

e9b84cbc2b7c9ce919a4b489c54b204a.png

但是需要FastDFS作为图片服务器,需要对外暴露图片的URL,还需要使用nginx作为反向代理,不过官方提供了nginx的模块支持。

H、安装nginx

# yum默认安装的版本有问题,nginx编译报错
yum isntall -y zlib pcre zlib-devel pcre-devel

访问IP:PORT,看到熟悉的nginx页面,至此nginx安装完成(未安装fastdfs-nginx-module模块)。

I、配置fastdfs-nginx-module

FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无法访问的错误。而fastdfs-nginx-module可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

1、http.conf与mime.types

将fastdfs-5.11/conf中的http.conf与mime.types拷贝到/etc/fdfs目录中以备fastdfs-nginx-module的配置文件调用。

cd /var/www/soft/fastdfs-5.11/conf
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

2、下载、配置fastdfs-nginx-module

cd /var/www/soft
git clone https://github.com/happyfish100/fastdfs-nginx-module.git

这里配置出错,会导致模块编译失败,这里贴出完整配置。

ngx_addon_name

3、编译fastdfs-nginx-module模块

cd /var/www/soft/nginx-1.15.12
./configure --add-module

4、配置nginx

8888端口号与/etc/fdfs/storage.conf中的http.server_port=8888相对应。

{
    listen       8888

5、重启nginx

# 报错nginx: [error] invalid PID number "" in "/run/nginx.pid"

J、访问URL

3fe4374d57c834194d9278f38e6f865d.png

至此FastDFS单点搭建完毕。

三、Spring Boot集成FastDFS

上篇总结,将图片通过Spring Boot的MultipartFile上传至容器,之后使用字节方式存储至服务器本地硬盘。本篇会在上篇基础上从前端上传文件到后台后,直接传递到FastDFS集群中,并返回文件存储的地址。

A、相关依赖

<dependency>
    

fastdfs-client-java为FastDFS的Java客户端,用来和FastDFS集群交互。

B、FastDFS配置

项目resources目录下添加fdfs_client.conf文件。

connect_timeout = 60
network_timeout = 60
charset = UTF-8
http.tracker_http_port = 8888
tracker_server = 10.255.242.129:22122
http.anti_steal_token = no
# http.secret_key = 123456

详细内容参考:https://github.com/happyfish100/fastdfs-client-java。

C、封装FastDFS上传工具类

封装FastDFSFile,文件基础信息包括文件名、内容、文件类型、作者等。

@Getter

封装FastDFSClient类,主要封装最基础的操作,包含上传、下载、删除等方法。

1、读取配置信息,初始化

static

ClientGlobal.init(filePath)方法会读取配置文件,并初始化对应的属性。

2、文件上传

使用FastDFS提供的客户端storageClient来进行文件上传,最后将上传结果返回。

public 
  • NameValuePair,主要存储文件的一些基础属性,如作者信息、创建时间等;
  • getStorageClient(),封装了获取客户端的方法。

使用TrackerServer构建出每次操作的客户端实例StorageClient。

private 

获取TrackerServer的方法。

private 

3、获取文件

根据groupName和文件名获取文件信息。group也可称为卷,同组内服务器上的文件是完全相同的,同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。

public 

4、下载文件

根据storageClient的API获取文件的字节流并返回。

public 

5、删除文件

根据文件名和组删除对应的文件。

public 

当使用FastDFS时,直接调用FastDFSClient对应的方法即可。

D、Controller

从MultipartFile中读取文件信息,然后使用FastDFSClient将文件上传到FastDFS集群,封装saveFile()方法用调用上面封装的FastDFS工具类,返回上传后文件的地址信息。

private 

controller代码跟上篇基本一致。

@GetMapping

在浏览器中上传图片,上传成功跳转至结果页面,FastDFS服务器中文件URL。

742a8c0149b13dd82d3c2a81e0fe810b.png

在实际项目使用中可以给Tracker配置好固定域名,将返回的地址信息存储到数据库中,前端业务调用时直接获取地址展示即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值