SpringBoot 集成 FastDFS(附安装教程)

news2024/11/27 0:44:30

1、FastDFS 简介

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

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

 

2、CentOS7安装

(1)启动 Docker 安装镜像

systemctl start docker
systemctl status docker

 已经正常启动 Docker,可以看到下面有 running ,出现其他可能未开启。

 (2)拉取镜像

docker pull morunchang/fastdfs

拉取成功,下图会出现 complete,网络可能会有影响,需要配置好镜像源。

 (3)查看网卡

docker network ls

 (4)创建网卡命令

docker network create mynet

 (5)运行tracker 使用自带的网卡

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

运行 storage,需要修改自己的地址。

CentOS7 系统通过如下命令查看地址,箭头位置就是本机 ip 地址

ip add

 docker run -d --name storage --net=host -e TRACKER_IP=192.168.179.128:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh

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

(6)配置nginx

docker exec -it storage  /bin/bash
vi /etc/nginx/conf/nginx.conf

(7) 禁止缓存

add_header Cache-Control no-store;

 保存并退出 wq!

退出容器

exit

(8) 重启 storage 容器

docker restart storage

 

 查看启动的容器

docker ps -a

 (9)开启启动设置,Docker 启动时。

docker update --restart=always tracker
docker update --restart=always storage

 (10)关闭防火墙

3、搭建SpringBoot项目进行使用

(1)创建 SpringBoot 项目

(2)添加依赖进行 import

 <dependency>
           <groupId>cn.bestwu</groupId>
           <artifactId>fastdfs-client-java</artifactId>
           <version>1.27</version>
       </dependency>

(3)在resources下面创建 fdfs_client.conf

#tracker服务器IP地址和端口号
tracker_server=192.168.179.128:22122

 (4)在application.yml文件下编写


spring:
  servlet:
    multipart:
      #如果是想要不限制文件上传的大小,那么就把两个值都设置为-1
      max-file-size: 5MB #设置单个文件的大小
      max-request-size: 10MB #设置单次请求的文件的总大小
FILE_SERVER_URL: http://192.168.179.128:8080/

添加这两处即可。注意修改 fastDFS 服务器 ip

max-file-size是单个文件大小,max-request-size是设置总上传的数据大小

如果是想要不限制文件上传的大小,那么就把两个值都设置为-1

 

 (5)修改启动类

禁止加载数据源

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

最后项目结构如下:

 还需要添加几个文件才可以。

(6)创建 Result

package com.example.mybatisdemo.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "数据传输对象-通用结果")
public class Result {
    @ApiModelProperty(value = "操作结果")
    private boolean success;
    @ApiModelProperty(value = "操作消息")
    private String message;

}

(7)创建 util 工具类

package com.example.mybatisdemo.util;

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

public class FastDFSClient {

	private TrackerClient trackerClient = null;
	private TrackerServer trackerServer = null;
	private StorageServer storageServer = null;
	private StorageClient1 storageClient = null;
	
	public FastDFSClient(String conf) throws Exception {
		if (conf.contains("classpath:")) {
			conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
		}
		ClientGlobal.init(conf);
		trackerClient = new TrackerClient();
		trackerServer = trackerClient.getConnection();
		storageServer = null;
		storageClient = new StorageClient1(trackerServer, storageServer);
	}
	
	/**
	 * 上传文件方法
	 * <p>Title: uploadFile</p>
	 * <p>Description: </p>
	 * @param fileName 文件全路径
	 * @param extName 文件扩展名,不包含(.)
	 * @param metas 文件扩展信息
	 * @return
	 * @throws Exception
	 */
	public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
		String result = storageClient.upload_file1(fileName, extName, metas);
		return result;
	}
	
	public String uploadFile(String fileName) throws Exception {
		return uploadFile(fileName, null, null);
	}
	
	public String uploadFile(String fileName, String extName) throws Exception {
		return uploadFile(fileName, extName, null);
	}
	
	/**
	 * 上传文件方法
	 * <p>Title: uploadFile</p>
	 * <p>Description: </p>
	 * @param fileContent 文件的内容,字节数组
	 * @param extName 文件扩展名
	 * @param metas 文件扩展信息
	 * @return
	 * @throws Exception
	 */
	public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
		
		String result = storageClient.upload_file1(fileContent, extName, metas);
		return result;
	}
	
	public String uploadFile(byte[] fileContent) throws Exception {
		return uploadFile(fileContent, null, null);
	}
	
	public String uploadFile(byte[] fileContent, String extName) throws Exception {
		return uploadFile(fileContent, extName, null);
	}
}

(8)创建controller

package com.example.mybatisdemo.controller;

import com.example.mybatisdemo.dto.Result;
import com.example.mybatisdemo.util.FastDFSClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/upload")
public class UploadController {

    @Value("${FILE_SERVER_URL}")
    private String FILE_SERVER_URL;//文件服务器地址

    @PostMapping("/uploadImg")
    public Result upload(@RequestParam(name = "file") MultipartFile file) {
        //1、取文件的扩展名
        String originalFilename = file.getOriginalFilename();
        String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        try {
            //2、创建一个 FastDFS 的客户端
            //3、注意项目不要在中文路径下,否则加载不到这个配置文件。
            FastDFSClient fastDFSClient = new FastDFSClient("classpath:fdfs_client.conf");
            //3、执行上传处理
            String path = fastDFSClient.uploadFile(file.getBytes(), extName);
            //4、拼接返回的 url 和 ip 地址,拼装成完整的 url
            String url = FILE_SERVER_URL + path;
            return new Result(true,  url);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,  "上传失败");
        }
    }

}

启动项目进行测试

 

(9)进行测试

使用的工具是 postman ,请求是 post

localhost:8080/upload/uploadImg

 请求之后下面会出现链接。

 

测试完成。

http://192.168.179.128:8080/group1/M00/00/00/wKizgGRD0nKAU7DwAARPzpqm-So529.png

注意,这里每次访问的端口是8080端口,访问的端口其实是storage容器的nginx端口,如果想修改该端口可以直接进入到storage容器,然后修改即可。

(10)修改端口

docker exec -it storage  /bin/bash
vi /etc/nginx/conf/nginx.conf

exit
 docker restart storage

http://192.168.179.128:9999/group1/M00/00/00/wKizgGRD0nKAU7DwAARPzpqm-So529.pngicon-default.png?t=N3I4http://192.168.179.128:9999/group1/M00/00/00/wKizgGRD0nKAU7DwAARPzpqm-So529.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bindiff工具使用-[GDOUCTF 2023]L!s!

目录 题目&#xff1a; 学到的点&#xff1a; 题目&#xff1a; 打了GDOUCTF的比赛&#xff08;被暴打了hhh)&#xff0c;学到很多新东西,这里总结一下 Diff的文件是ida数据库文件&#xff0c;选择i64或者idb文件进行Diff 打开附件&#xff0c;有两个文件&#xff0c;一个…

【Git 入门教程】第二节、Git基础使用

Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者更好地管理和维护代码。在本文中&#xff0c;我们将介绍Git的最基本操作&#xff0c;如安装Git、初始化仓库、添加文件、提交代码、查看记录等。 一、Git安装 1.下载 要使用Git&#xff0c;首先需要在计算机上安装G…

JavaWeb开发 —— 登录认证校验和异常处理

在 JavaWeb开发 —— SpringBootWeb综合案例 中我们通过实例部门管理以及员工管理中的详细操作。而这篇文章我们将会通过综合实例学习登录认证、登录校验以及异常处理的了解和掌握。 目录 一、基本登录功能 二、登录校验 1. 会话技术 1.1 客户端会话跟踪技术Cookie 1.2 …

iview render函数(vue render函数)

iview 的render函数就是vue的render函数&#xff0c;iview常用在表格里面自定义内容&#xff0c;下面来看render函数常用的配置&#xff1a; 1、 h是createdElement的简写&#xff0c;有3个参数&#xff1a; 语法&#xff1a;render:(h,params)>{} render:(h,params) >…

mulesoft MCIA 破釜沉舟备考 2023.04.25.24(易错题)

mulesoft MCIA 破釜沉舟备考 2023.04.25.24(易错题) 1. An insurance company is using a CIoudHub runtime plane.2. A mule application must periodically process a large dataset which varies from 6 GB lo 8 GB from a back-end database and write transform data lo…

LSTM简单介绍—然后使用LSTM对FashionMNIST数据集处理

文章目录 LSTM 简单介绍LSTM的基本结构LSTM的工作原理输入门遗忘门输出门细胞状态更新输出计算 总结代码实例 LSTM 简单介绍 在自然语言处理、语音识别等领域&#xff0c;长短时记忆网络 (Long Short-Term Memory, LSTM) 已经成为了常用的模型之一。本文将介绍 LSTM 的基本结构…

gpt在线使用-免费的 GPT在哪下载

免费的 GPT&#xff08;Generative Pre-trained Transformer&#xff09; 。现在您可以免费体验我们的 GPT 技术&#xff0c;来让您的业务或项目更加智能。 GPT 是一种基于最前沿的自然语言处理技术&#xff0c;它展现出了令人惊叹的预测能力和交互性能。我们的 GPT 是在世界顶…

警惕读书无用论,要知道一个人最可怕的就是精神世界的贫瘠和荒凉

孔乙已是鲁迅笔下人物&#xff0c;穷困流倒还穿着象征读书人的长衫&#xff0c;迁腐、麻木。最近&#xff0c;大家自我调佩是“当代孔乙己”&#xff0c;学历成为思想负担&#xff0c;找工作时高不成低不就。 一、社会对于学历和职业之间的关系认知是怎样的&#xff1f; 学历不…

Forefront GPT-4免费版:开启无限畅聊时代,乐享人工智能快感,无限制“白嫖”,还能和N多角色一起聊天?赶紧注册,再过些时间估计就要收费了

目录 前言注册登录方式应用体验聊天体验绘图体验 “是打算先免费后收费吗&#xff1f;”建议其它资料下载 前言 近期&#xff0c;人工智能技术迎来重大飞跃&#xff0c;OpenAI的ChatGPT等工具成为全球数亿人探索提高生产力和增强创造力的新方法。人们现在可以使用人工智能驱动…

绩效管理系统有哪些推荐?

绩效管理系统有哪些推荐&#xff1f;市面上的绩效管理系统五花八门&#xff0c;这就来给大家推荐几款优质的&#xff01; 一、如何选择绩效管理系统 在选择绩效管理系统之前&#xff0c;需要先考虑以下几个问题&#xff1a; 了解你的企业目标和需求&#xff1a;在选择绩效管…

nacos注册中心替换成eureka

背景 项目使用的springcloud、nacos、redis等插件&#xff0c;但是nacos比较重&#xff0c;小项目使用不到&#xff0c;想用一个tomcat部署项目&#xff0c;所以准备用eureka替换nacos&#xff1b; eureka Eureak 是Netflix 开源微服务框架中一系列项目中的一个。Spring Clo…

JVM 垃圾收集器

一&#xff0c;常用的垃圾收集器 如果说收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现。 如下图为年轻代和老年代的垃圾回收器&#xff0c;划线表示可以同时存在。 1&#xff0c;Serial Serial收集器是最基本、发展历史最悠久的收集器&…

怎么把录音文件转换成mp3格式,3个高效方法

在工作中&#xff0c;我们可能会选择录音来记录会议内容&#xff0c;以便之后整理会议纪要。但是我们知道录音文件的格式千差万别。比如在手机上录制的音频文件通常以M4A、WAV等多种格式存储&#xff0c;然而这些格式可能会存在不兼容的问题&#xff0c;导致我们无法在其他平台…

openEuler Developer Day 2023成功召开!发布嵌入式商业版本及多项成果

【中国&#xff0c;上海&#xff0c;2023年4月21日】openEuler Developer Day 2023于4月20-21日在线上和线下同步举办。本次大会由开放原子开源基金会指导&#xff0c;中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办&#xff0c;以“万涓汇流&#xff0c;奔涌向前…

3DEXPERIENCE MODSIM产品前期概念结构快速开发方案(下) | 达索系统百世慧®

基于3DEXPERIENCE单一数据源、实时多专业协同平台、附加全新CATIA建模方法与MODSIM建模仿真一体化技术&#xff0c;助力产品设计与仿真效率提升&#xff0c;产品多学科性能提升&#xff0c;产品轻量化减重等&#xff0c;全方位赋能产品前期概念结构高效高质开发。 目录 达索系…

利用css实现视差滚动和抖动效果

背景&#xff1a; 前端的设计效果&#xff0c;越来越炫酷&#xff0c;而这些炫酷的效果&#xff0c;利用css3的动画效果和js就可以实现&#xff0c;简单的代码就能实现非常炫酷的效果。 原理&#xff1a; 利用 js监控scrollTop的位置&#xff0c;通过 top定位图片的位置&#x…

halcon灰度积分投影/垂直积分投影

简介:关于灰度投影积分可以用到的场合很多,例如分割字符,分割尺子上的刻度等,适用于有规律的变化这些内容的检测。本文复现了论文《基于深度学习和灰度纹理特征的铁路接触网绝缘子状态检测》中灰度积分投影实现了对绝缘子缺陷位置的检测。见(图1)灰度积分垂直方向投影获得…

JAVAWeb09-WEB 工程路径专题

1. 工程路径问题 先看一个问题 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>base 标签</title> </head> <body> <h1>注册用户~~</h1> <!--解读:1.…

创建型模式-建造者模式

建造者模式 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示 这个模式适用于&#xff1a;某个对象的构建过程复杂的情况 将部件的构造与装配分离&#xff0c;由 Builder 负责构造&#xff0c;Director 进行装配&#xff0c;实现了构…

LeetCode——新手村

目录 前言 一、一维数组的动态和 1、题目 2、代码 二、将数字变成 0 的操作次数 1、题目 2、代码 三、最富有客户的资产总量 1、题目 2、代码 四、Fizz Buzz 1、题目 2、代码 五、链表的中间结点 1、题目 2、代码 六、赎金信 1、题目 2、代码 前言 注册了一个LeetCode的…