docker部署FastDFS整合Springboot

news2024/11/19 19:19:46

文章目录

    • 1、FastDFS是什么?
    • 2、搭建docker环境
    • 3、部署fastdfs
    • 4、整合springboot
    • 5、接口测试
    • 参考文章

1、FastDFS是什么?

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务

2、搭建docker环境

参考文章:

https://blog.csdn.net/JiuMen3520/article/details/134336301

3、部署fastdfs

1、搜索fastdfs镜像
docker search fastdfs
2、下载镜像
方法一(直接拉取):
docker pull morunchang/fastdfs

方法二(百度网盘下载):
链接:https://pan.baidu.com/s/1pAS_wOFJrpk-BlNs3lZYfQ?pwd=bfmu 
提取码:bfmu

若选择方法二,执行docker导入镜像命令:
docker load -i fastdfs_latest.tar
3、启动tracker
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
4.启动storage
(1)宿主机创建目录(用于磁盘挂载)
mkdir /data/fastDFS/data
(2)执行启动命令
docker run -v /data/fastDFS/data:/data/fast_data/data/00/00 -d --name storage --net=host -e TRACKER_IP=服务器访问IP:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh

启动效果:
在这里插入图片描述
修改nginx配置

1.进入storage
    docker exec -it storage容器id /bin/bash
 
2.找到nginx配置
    whereis nginx --->会看到目录在/etc/nginx/下
 
3.修改nginx配置
    vi /etc/nginx/conf/nginx.conf
 
4.修改监听端口(listen)和访问地址(server_name),我这将端口修改为了80,访问地址为公网ip
 
5.退出容器
    exit 
 
6.重启 storage
    docker restart storage容器id

4、整合springboot

(1)新建springboot项目
(2)加入maven依赖

   <!-- FastDFS -->
   <dependency>
       <groupId>com.github.tobato</groupId>
       <artifactId>fastdfs-client</artifactId>
   </dependency>

在这里插入图片描述
(3)修改配置文件yml

# FastDFS配置
fdfs:
  domain: http://服务器IP
  soTimeout: 3000
  connectTimeout: 2000
  trackerList: 服务器IP:22122

在这里插入图片描述
(3)创建controller类

package com.pie.file.controller;

import com.pie.common.core.domain.R;
import com.pie.common.core.utils.file.FileUtils;
import com.pie.file.service.ISysFileService;
import com.pie.system.api.domain.SysFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件请求处理
 * 
 * @author p
 */
@RestController
public class SysFileController
{
    private static final Logger log = LoggerFactory.getLogger(SysFileController.class);

    @Autowired
    private ISysFileService sysFileService;

    /**
     * 文件上传请求
     */
    @PostMapping("upload")
    public R<SysFile> upload(MultipartFile file)
    {
        try
        {
            // 上传并返回访问地址
            String url = sysFileService.uploadFile(file);
            SysFile sysFile = new SysFile();
            sysFile.setName(FileUtils.getName(url));
            sysFile.setUrl(url);
            return R.ok(sysFile);
        }
        catch (Exception e)
        {
            log.error("上传文件失败", e);
            return R.fail(e.getMessage());
        }
    }
}

(4)创建service接口

package com.pie.file.service;

import org.springframework.web.multipart.MultipartFile;

/**
 * 文件上传接口
 * 
 * @author p
 */
public interface ISysFileService
{
    /**
     * 文件上传接口
     * 
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception;
}

(5)创建serviceImpl实现类

package com.pie.file.service;

import java.io.InputStream;
import com.alibaba.nacos.common.utils.IoUtils;
import com.pie.common.core.utils.file.FileTypeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;

/**
 * FastDFS 文件存储
 *
 * @author p
 */
@Primary
@Service
public class FastDfsSysFileServiceImpl implements ISysFileService
{
    /**
     * 域名或本机访问地址
     */
    @Value("${fdfs.domain}")
    public String domain;

    @Autowired
    private FastFileStorageClient storageClient;

    /**
     * FastDfs文件上传接口
     *
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        InputStream inputStream = file.getInputStream();
        StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(),
                FileTypeUtils.getExtension(file), null);
        IoUtils.closeQuietly(inputStream);
        return domain + "/" + storePath.getFullPath();
    }
}

5、接口测试

使用postman访问接口测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考文章

参考文章

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

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

相关文章

树莓派4B_OpenCv学习笔记13:OpenCv颜色追踪_程序手动调试HSV色彩空间_检测圆

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; OpenCv颜色追踪_程序手动调试HSV色彩空间_检测灰度图中的…

Windows USB设备驱动开发 - 常见概念的解释

我们听到许多 USB 术语几乎交替抛出。 它们都是什么意思&#xff1f;假设我们看到类似 “多亏了 USB 3.0&#xff0c;我可以将 SuperSpeed U 盘连接到电脑的 xHCI 主机控制器&#xff0c;并更快地复制文件。” 让我们了解该句子中的 USB 术语。 USB 3.0、USB 2.0 和 USB 1.0 请…

C语言 | Leetcode C语言题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; void cleanLand(char** grid, int gridSize, int ColSize,int row,int column) {if(grid[row][column] 1){//不等于1则清零grid[row][column] 0;}else{//不等于1则返回return ;}int newRow;int newColumn;//上if(row ! 0) //还能上{ne…

关于 AD21导入电子元器件放置“3D体”STEP模型失去3D纹理贴图 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139969415 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

java Logback 日志格式参数详细说明

logback 打印日志格式介绍官网 Springboot [日志管理LogBack] java Logback 日志格式参数详细说明 打印日志格式&#xff1a; <property name"LOG_PATTERN" value"[${APP_NAME} ${SERVER_IP}:${SERVER_PORT}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} …

【项目实训】面试经验总结页面编写(前期探索)

首先&#xff0c;我们想尝试编写和chatchat项目兼容的页面展示部分&#xff0c;在编写成功之后&#xff0c;由于streamlit库是一个很强大的python库&#xff0c;比较死板&#xff0c;做出的页面并不尽如人意&#xff0c;于是我们放弃了这种方法。但这也是探索前端页面展示形式的…

【Android面试八股文】Framework面试:ThreadLocal的原理,以及在Looper是如何应用的?

文章目录 ThreadLocal的原理,以及在Looper是如何应用的?ThreadLocal 是什么ThreadLocalMap是什么?ThreadLocal在Looper中的应用**总结**扩展阅读ThreadLocal的原理,以及在Looper是如何应用的? ThreadLocal 可以把一个对象保存在指定的线程中,对象保存后,只能在指定线程…

找不到模块“@/stores/xxx”或其相应的类型声明。

找不到模块“/stores/xxx”或其相应的类型声明。 问题图示 在 Vue3 项目中&#xff0c;特别是在使用 TypeScript 时&#xff0c;/ 符号通常是用来代表项目根目录的别名。例如&#xff0c;/stores/xxx 可能是指向你项目中的某个 store 文件或目录。出现找不到模块的错误通常是由…

FastGPT 调用Qwen 测试Hello world

Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录&#xff0c; 点击右上角的 新建 点击 这里&#xff0c;配置AI使用本地 ollama跑的qwen模型 问题&#xff1a;树上有3只鸟&#xff0c;开了一枪&#…

【C++】内存分区

目录 内存分区代码运行前后区别各分区详细解释C内存申请和释放 内存分区 不同的操作系统对程序内存的管理和划分会有所不同。 此处是C内存区域划分主要是针对通用的情况&#xff0c;并不限定在某个特定操作系统上 一般分为4个区&#xff08;有时把全局区拆分成数据区未初始化…

Git企业开发---初识Git

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 引言 不知道大家有没有经历这种困惑&#xff0c;当我们要去交某文档时&#xff0c;总是要进行修改&#xff0c;修改后再交…

python3用两个栈实现一个队列

栈与队列 栈&#xff1a;先入后出&#xff0c;First In First Out (FIFO) &#xff0c;类似桶&#xff08;入到桶底、取从桶顶&#xff09; 队列&#xff1a;先入先出&#xff0c;First In Last Out (FILO) 用两个栈实现一个队列 两个桶&#xff08;栈&#xff09;&#x…

linux centos rabbitmq3.7.5 一键安装部署

linux centos rabbitmq3.7.5 一键安装部署 一、基础理论二、kafka和rocketmq、rabbitmq的区别三、下载所需安装包四、一键安装 一、基础理论 RabbitMQ是一个实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff0c;其作用主要体现在以下几个方面&a…

K8S -理解StatefulSet - 部署有状态应用

什么是 有状态服务和 无状态服务 有状态服务&#xff08;Stateful Service&#xff09;&#xff1a; 有状态服务是指在处理请求期间维护和跟踪用户状态或会话信息的服务。这意味着服务在多个请求之间保持状态&#xff0c;并且需要在请求之间共享和使用这些状态信息。通常&…

常微分方程算法之编程示例五(阿当姆斯法)

目录 一、研究问题 二、C代码 三、计算结果 一、研究问题 本节我们采用阿当姆斯法&#xff08;Adams法&#xff09;求解算例。 阿当姆斯法的原理及推导请参考&#xff1a; 常微分方程算法之阿当姆斯法&#xff08;Adams法&#xff09;_四步四阶adams显格式;三步四阶adams隐…

【STM32】外部中断

1.EXTI简介 外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器&#xff0c;可以实现输入信号的上升沿检测和下降沿的检测。 EXTI可以实现对每个中断/事件线进行单独配置&#xff0c;可以单独配置为中断或者事件&#xff0c;以及…

Spring Ai入门

SpringAI是一个AI工程应用框架&#xff0c;旨在将Spring生态系统的设计原则&#xff08;如可移植性和模块化设计&#xff09;应用于AI领域。它推广使用Plain Old Java Object&#xff08;POJO&#xff09;作为AI应用程序的构建块&#xff0c;从而为Java开发者提供了一种更简洁的…

JavaScript中常用数据类型做布尔值(Boolean)转换

一、前言 二、示例 1、String转Boolean 2、Number转Boolean 3、NaN、Null、undefined 转Boolean 4、Object转Boolean 5、Array转Boolean 6、Symbol转Boolean 三、总结 四、思考 一、前言 JavaScript中&#xff0c;经常需要对一些值进行boolean判断&#xff0c;根据判…

【efinix】efinity如何安装官方补丁patch

efinix官网可以下载efinity的官方补丁。 下载 efinity-2023.2.307.5.10-windows-x64-patch.zip 解压缩补丁zip 压缩包内容 files/ : updated files to be copied into the Efinity installation run.sh : patch installation script (Linux on…

【Nginx】静态资源访问配置

nginx 静态资源访问配置 Nginx 静态资源访问配置 通过该片文章&#xff0c;你能了解图中的内容&#xff1a; 实际问题 Nginx 应该怎么写&#xff0c;才能匹配这个图片资源路径&#xff1f; http://47.120.10.110:7001/public/images/picture.jpg解决方案 你需要配置一个 N…