FastDfs

我们之前可能接触到了文件上传下载的一些内容,upload等服务属于一些单体结构的服务,但是部署到服务器上之后,只能应对一些并发量小的访问,一旦在分布式下就展现出了它的弊端。



提示:以下是本篇文章正文内容,下面案例可供参考

一、FastDFS简介

1.为什么使用FastDfs

  1. 在分布式系统下,文件上传至节点A,但是通过负载均衡之后,访问了节点B,则不能访问文件,所以会出现时而能访问时而不能访问的结果。
  2. 还有文件的冗余备份、负载均衡、线性扩容都不是上面的单节点的文件系统所具有的。

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配置的操作可以去查看我的详细的配置文件自己去进行操作实践。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐