文件存储服务

全套代码及资料全部完整提供,点此处下载

1. 需求背景

文件的上传、下载功能是软件系统常见的功能,包括上传文件、下载文件、查看文件等。例如:电商系统中需要上传商品的图片、广告视频,办公系统中上传附件,社交类系统中上传用户头像等等。

文件上传下载大致流程为:

这种方式开发起来简单、直接,但是有一些问题:

  • 重复开发: 比如对接某个OSS(Object Storage Service,简称OSS)服务商, 每个应用都需要对接该服务商,重复工作
  • 扩展性差: 当需要切换服务商时,所有涉及到的应用都需要修改、测试、上线

基于以上原因,微服务体系下的应用系统一般都有一个文件服务,用于统一管理文件上传下载等功能,大型电商系统甚至有独立的文件、图片、视频服务。此时架构体系变为:

这种方式提供一个独立的文件微服务,该微服务向应用系统提供统一的上传、下载、查看接口,应用系统调用方式相同,并且屏蔽了底层对外调用OSS服务的接口,即使以后迁移OSS服务商,应用层面的系统也不需要变动。

这种模式也有一个小问题,比如我们调用了阿里云的OSS服务,如果所有的下载、查看功能都调用文件服务,那么文件服务的网络流量将会有非常大的压力。所以常用的做法是这样的:

2. 核心功能

文件存储服务的核心功能是:上传和下载。除了这两个核心功能,还具有:

  • 可用性:作为基础性服务,通过集群化部署实现高可用
  • 配置性:结合nacos配置中心,可动态配置上传下载的方式等配置
  • 扩展性:采用策略设计模式能方便的进行扩展,如添加新的OSS服务商等

本系统的文件服务提供两种类型的服务:

​ 1、面对应用系统的通用附件服务

​ 提供统一的上传接口,屏蔽底层的存储方案(本地存储、FastDFS、MinIo、阿里云存储、七牛云存储等),可独立运行服务

​ 2、面对用户的网盘服务

​ 有文件夹和文件的概念,支持大文件分片上传、合并

​ 3、面对大屏展示的数据统计服务

​ 有云盘首页数据概览,按照类型/时间等维度统计各种类型文件的大小和数量等

3. 存储策略

3.1 本地存储

本地存储,即将上传的文件存储在本地磁盘,并通过本地提供的Nginx服务来对外提供文件的下载和查看等功能。

3.2 FastDFS存储

FastDFS存储,即将上传的文件存储在FastDFS分布式文件存储系统中,并通过FastDFS结合Nginx提供的服务来对外提供文件的下载和查看等功能。

3.3 云存储

云存储,即将上传的文件存储在第三方云平台上,例如阿里云OSS、七牛云OSS服务等,并通过这些第三方提供的OSS服务来对外提供文件的下载和查看等功能。

3.4 minio

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

4. 技术设计

本系统的文件存储服务以品达通用权限系统为脚手架,在此基础之上进行开发。为了能够提供统一的上传接口从而屏蔽底层的存储方案,需要进行相应的接口设计:

FileStrategy:文件策略顶层接口

AbstractFileStrategy:抽象文件策略处理类,实现FileStrategy接口。实现主要的文件上传处理流程,但是真正上传的过程需要其子类来完成。

LocalServiceImpl:具体的文件策略处理类,是AbstractFileStrategy的子类,负责将上传的文件保存在本地磁盘。

FastDfsServiceImpl:具体的文件策略处理类,是AbstractFileStrategy的子类,负责将上传的文件保存到FastDFS上。

AliServiceImpl:具体的文件策略处理类,是AbstractFileStrategy的子类,负责将上传的文件保存到阿里云OSS上。

MinioServiceImpl:具体的文件策略处理类,是AbstractFileStrategy的子类,负责将上传的文件保存到Minio上。

注意:本系统目前提供的存储策略有以上四种方式(即本地存储、FastDFS存储、Minio存储、阿里云OSS存储),后期也可以根据需要扩展其他的存储策略。这种设计方式其实就是策略模式的一个具体应用。

全套代码及资料全部完整提供,点此处下载

第2-3-1章 文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss的更多相关文章

  1. nodejs实现一个文件存储服务

    nodejs实现一个文件存储服务 模拟文件上传下载功能: PUT 上传一个文件,URL表示在服务器上待上传文件的路径. GET 下载一个文件,URL表示在服务器上待下载文件的路径.

  2. 小白从零开始阿里云部署react项目+node服务接口(一:阿里云服务器)

    准备阿里云服务器,并安装系统 如果没用自己服务器可以购买一个 https://www.aliyun.com/minisite/goods?userCode=x7i5glgc 初级购买一个1核2G的主机 ...

  3. 短视频服务大PK,阿里云、腾讯云、又拍云、七牛云、金山云5强横向对比

    继直播后,短视频又再次爆发,在这个风口,国内的各大云厂商也都相继推出了自己的一站式短视频解决方案.上周由于公司短视频功能开发的需要,对比了阿里云.腾讯云.又拍云.七牛云.金山云5家的短视频服务. 先介 ...

  4. 第2-1-3章 docker-compose安装FastDFS,实现文件存储服务

    目录 4 docker-compose安装FastDFS 4.1 docker-compose-fastdfs.yml 4.2 nginx.conf 4.3 storage.conf 4.4 测试 4 ...

  5. 第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio-minio全网最全的资料

    目录 1. MinIO介绍 2. MinIO应用场景 2.1 单主机单硬盘模式 2.2 单主机多硬盘模式 2.3 多主机多硬盘分布式 3. MinIO特点 4. 存储机制 5. docker安装Min ...

  6. 搭建基于 HDFS 碎片文件存储服务

    安装 JDK HDFS 依赖 Java 环境,这里我们使用 yum 安装 JDK 8,在终端中键入如下命令: yum -y install java-1.8.0-openjdk* 使用如下命令查看下 ...

  7. Ant Design Upload 组件上传文件到云服务器 - 七牛云、腾讯云和阿里云的分别实现

    在前端项目中经常遇到上传文件的需求,ant design 作为 react 的前端框架,提供的 upload 组件为上传文件提供了很大的方便,官方提供的各种形式的上传基本上可以覆盖大多数的场景,但是对 ...

  8. 第2-1-4章 SpringBoot整合FastDFS文件存储服务

    目录 5 SpringBoot整合 5.1 操作步骤 5.2 项目依赖 5.3 客户端开发 5.3.1 FastDFS配置 5.3.2 FastDFS配置类 5.3.3 文件工具类 5.3.4 文件上 ...

  9. JavaWeb结合七牛云存储搭建个人相册服务

    JavaWeb结合七牛云存储搭建个人相册服务 一.引言1. 课程概述 相信很多人都知道网站一般会有很多图片,对于小型网站来说,图片放在网站服务器上不算什么,但当图片数量很大时,会造成服务器很臃肿,相应 ...

随机推荐

  1. 【java】学习路径16-重写Object方法(equals()等)

    在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便. 举个栗子,我们有两个cafe对象,我们想比较两杯咖啡的价格是否一样,一般来说我们使用getter()来比较,但是这 ...

  2. 字节跳动端智能工程链路 Pitaya 的架构设计

    Client AI 是字节跳动产研架构下属的端智能团队,负责端智能 AI 框架和平台的建设,也负责模型和算法的研发,为字节跳动开拓端上智能新场景.本文介绍的 Pitaya 是由字节跳动的 Client ...

  3. 第八篇:用css写一个登录界面

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. HCNP Routing&Switching之IP安全

    前文我们了解了DHCP安全相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16637627.html:今天我们来聊一聊IP安全相关话题: 技术背景 随着 ...

  5. Kingbase V8R6存储过程变量数据导出到操作系统文件

    Kingbase V8R6存储过程变量数据导出到操作系统文件 说明: KingbaseES V8R6如何将自定义过程中的变量数据导出到操作系统文件中. 本次案例数据库版本: test=# select ...

  6. spring native 初体验实现 小米控制美的空调

    目前关于 spring native 分享的文章还比较少 写这篇文章的主要目前是分享一下自己写的一个 小米控制美的空调 的程序 集成 spring native 过程中碰到的一些问题和解决方法 先放地 ...

  7. python 模块、原始字符串

    模块 三种方法: import from 模块 import 成员,成员 from 模块 import * *代表所有的成员 隐藏成员: 模块中以下划线_开头的属性 隐藏成员不会被from 模块 im ...

  8. WSL 2简介

    Windows Subsystem for Linux(WSL)适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能.相比前一 ...

  9. Git Rebase-提交整洁之道

    git rebase git rebase是一个非常有用的命令,但知道和用的人非常少,今天介绍一下其作用 git rebase -i 作用:常用来合并多个相同目的的提交. 交互式有下面几个命令,常用命 ...

  10. 《Java基础——方法的调用》

    Java基础--方法的调用     总结: 1. 在同一个类中-- 对于静态方法,其它的静态和非静态方法都可以直接通过"方法名"或者"类名.方法名"调用它. 对 ...