FastDfs详解及使用
FastDfs我们之前可能接触到了文件上传下载的一些内容,upload等服务属于一些单体结构的服务,但是部署到服务器上之后,只能应对一些并发量小的访问,一旦在分布式下就展现出了它的弊端。文章目录FastDfs一、FastDFS简介1.为什么使用FastDfs2.FastDfs体系结构3.文件上传流程二、FastDfs安装三、FastDfs微服务1.项目搭建总结提示:以下是本篇文章正文内容,下面案例
FastDfs
我们之前可能接触到了文件上传下载的一些内容,upload等服务属于一些单体结构的服务,但是部署到服务器上之后,只能应对一些并发量小的访问,一旦在分布式下就展现出了它的弊端。
提示:以下是本篇文章正文内容,下面案例可供参考
一、FastDFS简介
1.为什么使用FastDfs
- 在分布式系统下,文件上传至节点A,但是通过负载均衡之后,访问了节点B,则不能访问文件,所以会出现时而能访问时而不能访问的结果。
- 还有文件的冗余备份、负载均衡、线性扩容都不是上面的单节点的文件系统所具有的。
2.FastDfs体系结构
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、下载,通过Tracker server 调度最终由 Storage server 完成文件上传和下载。Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storageserver 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。
冗余备份:在一个组里(这里也叫卷)的文件存储服务,例如将文件上传到了上面的Storager1-1,根据FastDfs的冗余备份,就会在Storager1-2也会备份一份,当1-1宕机以后,可以使用1-2作为主机提供服务。
负载均衡:Tracker就是它的一个负载均衡的一个组件,详细的就不做过多描述
3.文件上传流程
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
组名:文件上传后所在的 storage 组名称,在文件上传成功后有storage 服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。
数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
二、FastDfs安装
这里使用docker来进行FastDfs的安装。
首先拉取镜像:
docker pull morunchang/fastdfs
运行tracker
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
运行storager
docker run -d --name storage --net=host -e TRACKER_IP=39.108.90.162:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
进入容器去查看和修改配置文件
docker exec -it storage /bin/bash
docker exec -it tracker /bin /bash
详细的配置可以查看:FastDfs详细配置
三、FastDfs微服务
1.项目搭建
1.引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- FastDFS依赖 -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.7</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
2.编写配置
server:
port: 9004
logging:
#file: demo.log
pattern:
console: "%d - %msg%n"
level:
org.springframework.web: debug
com.lxs: debug
spring:
application:
name: upload-service
servlet:
multipart:
enabled: true
max-file-size: 10MB #单个文件上传大小
max-request-size: 20MB #总文件上传大小
fdfs:
# 链接超时
connect-timeout: 60
# 读取时间
so-timeout: 60
# 生成缩略图参数
thumb-image:
width: 150
height: 150
tracker-list: 192.168.220.100:22122
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
#更倾向于使用ip地址,而不是主机名
prefer-ip-address: true
#ip地址
ip-address: 127.0.0.1
#续约间隔,默认30秒
lease-renewal-interval-in-seconds: 5
#服务的实效时间, 默认90秒
lease-expiration-duration-in-seconds: 5
3.编写启动器
package com.lxs.upload;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class UploadApplication {
public static void main(String[] args) {
SpringApplication.run(UploadApplication.class, args);
}
}
4.编写FastDfs配置类
package com.lxs.upload.config;
import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(FdfsClientConfig.class)
public class DfsConfig {
}
这里我们不配置详情配置,我们只需引入FdfsClientConfig这个配置类的一些配置就行。
5.编写FastDfs工具类
package com.lxs.upload.config;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.catalina.Store;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class FileDfsUtil {
@Autowired
private FastFileStorageClient storageClient;
/**
* 上传文件
* @param multipartFile
* @return
* @throws Exception
*/
public String upload(MultipartFile multipartFile) throws Exception {
String extName = FilenameUtils.getExtension(multipartFile.getOriginalFilename());
StorePath storePath = storageClient.uploadImageAndCrtThumbImage(multipartFile.getInputStream(), multipartFile.getSize(), extName, null);
return storePath.getFullPath(); // "/group1/M00/00/00/wKjcZF8ekIWAEyMAAABzzes71pI891.jpg"
}
/**
* 删除文件
* @param fileUrl
*/
public void deleteFile(String fileUrl) {
StorePath storePath = StorePath.parseFromUrl(fileUrl);
storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
}
}
6.编写Controller
在这里插入代码片
7.使用postman测试
上传测试
删除测试
总结
详细的FastDfs配置的操作可以去查看我的详细的配置文件自己去进行操作实践。
更多推荐
所有评论(0)