1 FastDFS

1.1 FastDFS介绍

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。国开发源的

作用:费用便宜、重要资源掌握在自己手里、访问速度购买CDN

OSS存储:第三方存储服务。优点:实现技术简单,不需要搭建服务,只调用服务提供方的api即可。缺点:你的数据在第三方手上,费用高。创业型(早期成本低,快速实现)

FastDFS|MinIO:优点:数据保存企业自己手里,费用低;缺点:搭建成本、运维,访问速度(购买cdn),使用复杂 。(中大型)坚守与降低成本

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称为存储服务器。

1.1 FastDFS服务端搭建–容器搭建

(1)虚拟机中拉取镜像

docker pull morunchang/fastdfs

(2)运行tracker

docker run -d --name tracker --restart=always --net=host morunchang/fastdfs sh tracker.sh

(3)运行storage

docker volume create fdfs-data
docker run -d --name storage --net=host -e TRACKER_IP=172.16.147.129:22122 -e GROUP_NAME=group1 -v fdfs-data:/data/fast_data morunchang/fastdfs sh storage.sh

说明:

使用的网络模式是–net=host, 172.16.147.129是宿主机的IP
group1是组名,即storage的组
如果想要增加新的storage服务器,再次运行该命令,注意更换 新组名

查询storage是否启动成功:

docker logs -f storage

有以下Successfully connect to tracker server …

设置开启自启动(可以不做):

docker update --restart=always tracker

1.容器启动起来可以看到up状态

fastdfs对比HDFS fastdfs的好处_服务器

【ECS服务器】云服务器则开启以下端口
网络安全: 进站与出站 开放TCP端口
22122
8080
23000
8888

(4)修改nginx

Nginx在这里主要提供对FastDFS图片访问的支持,Docker容器中已经集成了Nginx,我们需要修改nginx的配置,进入storage的容器内部,修改nginx.conf

(4.1)进入容器

docker exec -it storage /bin/bash

(4.2)修改配置

vi /etc/nginx/conf/nginx.conf

修改监听访问端口为80,就是默认访问

(4.3) 重启storage

docker restart storage

二:在项目中使用

1.创建springBoot项目,这个不做赘述

2.添加依赖

<!--fastdfs-->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.5</version>
        </dependency>
        <!--下面这个是公用项目,里面集成了knife4j依赖,你们需要自己添加-->
        <dependency>
            <groupId>com.aotain</groupId>
            <artifactId>aotain-leadnews-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

3.配置yml文件

server:
  port: 9005
spring:
  application:
    name: leadnews-dfs
  cloud:
    nacos:
      server-addr: 172.16.147.129:8848
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
# fastdfs的配置
fdfs:
  so-timeout: 15001
  connect-timeout: 6001
  thumb-image:             #缩略图生成参数
    width: 150
    height: 150
  tracker-list:
    - 172.16.147.129:22122 #TrackerList参数,支持多个
  web-server-url: http://172.16.147.129/  # 设置前缀路径
#=================== knife4j配置 ===========
steven:
  knife4j:
    description: fastDfs文件存储系统api
    title: Dfs文件存储系统api
    contact: 曾:15570133957
    serviceUrl: http://www.aotain.com.com

4.创建启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author zengFanLiang
 * @Date 2021/10/12
 * @User 添砖Java的亮哥
 * 快乐开心每一天~~~
 */
@SpringBootApplication
public class DfsApplication {
    public static void main(String[] args) {
        SpringApplication.run(DfsApplication.class,args);
    }
}

5.创建控制器层,编写上传代码

mport com.github.tobato.fastdfs.domain.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.itheima.common.vo.ResultVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Collections;

/**
 * @author zengFanLiang
 * @Date 2021
 * @User 亮哥
 * 快乐开心每一天~~~
 */
@RestController
@RequestMapping("/dfs")
@Slf4j
@Api(tags = "Fdfs上传文件测试")
public class FileController {
    @Autowired
    private FastFileStorageClient client;

    @Autowired
    private FdfsWebServer fdfsWebServer;

    /**
     * 上传文件
     * @param multipartFile
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public ResultVo upload(MultipartFile multipartFile) {
        //1. 上传文件到fastdfs
        try {
            StorePath storePath = client.uploadFile(multipartFile.getInputStream(), multipartFile.getSize(),
                    StringUtils.getFilenameExtension(multipartFile.getOriginalFilename()), null);
            //2. 拼接文件的完整路径
            String url = fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
            log.debug("上传文件url:{}",url);
            //3. 返回文件路径
            return ResultVo.ok(Collections.singletonMap("url", url));
        } catch (IOException e) {
            log.error("上传文件失败", e);
        }
        return ResultVo.error();
    }

    public static void main(String[] args) {
    }
}

6.测试上传文件功能是否成功

访问:http://localhost:9005/doc.html

fastdfs对比HDFS fastdfs的好处_spring_02


看到返回的路径就知道是成功了,前端就可以根据这个地址去获取图片。