关于java:从零搭建Spring-Boot脚手架7整合OSS作为文件服务器

34次阅读

共计 3768 个字符,预计需要花费 10 分钟才能阅读完成。

1. 前言

文件服务器是一个利用必要的组件之一。最早我搞过 FTP,而后又用过FastDFS,接私活的时候我用MongoDB 也对付对付。现如今时代不同了,开始风行起了OSS

Gitee: https://gitee.com/felord/kono day06 分支 欢送 Star

GitHub: https://github.com/NotFound40… day06 分支 欢送 Star

2. 什么是 OSS

全称为 Object Storage Service,也叫 对象存储服务,是一种解决和解决离散单元的办法,可提供基于分布式系统之上的对象模式的数据存储服务,具备可拓展、可治理、低成本等特点,反对核心和边缘存储,可能实现存储需要的弹性伸缩,次要利用于海量数据管理的各类场景。

这概念真是够难以了解的。简略说点我晓得的吧,平时咱们的文件地址都是 /User/felord/video/xxx.mp4的目录树结构,零碎先要找到User,而后一级一级往下找始终到指标为止,这是一种结构化的存储形式。对象存储就不一样了,所有的文件都放在一个特定的池子里,只不过文件的携带有它本人的元信息,通过元信息去检索文件。这里举一个形象的例子:

{"oss":[{"file":"xxxxx","meta":{"id":"1111"},"type":""},
    {"content":"xxxxx","meta":{"id":"1211"},"type":"","created":"","name":""}, 
]}

上图的 oss 就是一个对象存储,它外面存了携带信息不一样、甚至构造都不一样的货色,咱们能够依据其元信息 meta 检索它们。OSS具备以下特点:

  • 效率更高。不受简单目录系统对性能的影响。
  • 可扩展性更强。分布式架构,更便于进行程度扩大,从而包容进任意大规模的数据。
  • 可用性更强。数据个别都会有多个位于不同机器的复制,确保数据不失落。
  • 平台无关,能够通过 Restful 接口进行操作对象。

OSS通常被用来存储图片、音视频等文件,以及对这些文件的解决。

3. 哪些 OSS 能够应用

通常咱们有两种抉择,花钱买或者本人搞。

充钱能力变得更强

这句话这里也是很实用的,目前简直所有的云厂商都有本人的对象存储产品,你能够比照一下花钱购买它们,通过配合 CDN 能达到十分好的用户体验,胖哥的 felord.cn 就应用了云厂商的对象存储。购买他们的服务

  • 可靠性强,数据失落可能性低。
  • 免保护,不须要自行保护。
  • 可配合其它一些特色性能,比方缩略图、CDN 等等。

本人入手饥寒交迫

不想花钱就只能本人入手了,目前我晓得的开源计划有两种。

一种是 Ceph, 一个分布式存储系统,高可用,高扩展性。然而个别人玩不转,就连 开源中国 红薯 都被坑惨了????。

另一种是 Minio,用Golang 写的。我目前还没发现有什么坑,文档竟然还有中文文档!我用 Docker 不到三分钟就玩起来了,竟然还自带控制台!其它性能也挺齐全,各种客户端 SDK 齐全。

因为装置过于简略就不演示了。

4. 整合到 Spring Boot

无论你花钱还是本人搞都能够,这两种形式各有各的益处。所以我要把这两种形式整合到 kono Spring Boot 脚手架我的项目中。这种组件封装成为 Spring Boot Starter 再好不过了。在日常开发中这种根底组件都倡议做成 Starter。参考我的 最强自定义 Spring Boot Starter 教程里的形式,我将aliyunOSS SDKMinio SDK 封装成 Starter 了。

达到了开箱即用。而且非常灵活,你配置哪种应用哪种,能够二选一,也能够全都要,还能够全都不要。

我的项目地址: https://gitee.com/felord/oss-…。

获取到我的项目后通过 Maven 命令 mvn install 装置到本地依赖库,或者你公布到你的近程公有 Maven 仓库。而后再援用 Starter 切记先后步骤

<!--  肯定要先拉取我的项目通过 mvn install 装置到本地  -->
<dependency>
    <groupId>cn.felord</groupId>
    <artifactId>oss-spring-boot-starter</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>

Minio 配置流程

接着就是应用了,先在你 Minio 的管制台上创立一个bucket, 能够了解为一个对象池。

而后把策略设置为 可读写

搞完开始在我的项目中配置,application.yaml中:

oss:
  minio:
  # 启用 
    active: true  
    access-key: minio_access_key
    secret-key: felord_cn_sec_key
  # minio 地址  
    endpoint: http://localhost:9000

aliyun OSS 配置流程

额定引入依赖:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.5.0</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.3.8</version>
</dependency>

这是必须的步骤。

ali OSS 控制台申请Minio差不多的几样货色用来配置:

oss:
  aliyun:
    active: true
    access-key-id: LTAI4GH4EQXtKEbJDrADvWNH
    access-key-secret: XjDpNn5JqHAHPDXGL6xIebyUkyFAZ7
    endpoint: oss-cn-beijing.aliyuncs.com

Starter 的应用

以下是我对 OSS 操作的形象接口:

package cn.felord.oss;

import java.io.InputStream;

/**
 * The interface Storage.
 *
 * @author felord.cn
 * @since 2020 /8/24 19:54
 */
public interface Storage {


    /**
     * 寄存对象
     *
     * @param bucketName   bucket  名称
     * @param objectName  自定义对象名称
     * @param inputStream  对象的输出流
     * @param contentType  参考 http 的 MimeType 值
     * @throws Exception the exception
     */
    void putObject(String bucketName, String objectName, InputStream inputStream, String contentType) throws Exception;

    /**
     *  获取对象
     *
     * @param bucketName the bucket name
     * @param objectName the object name
     * @return the object
     */
    InputStream getObject(String bucketName, String objectName) throws Exception;

    /**
     *  获取对象的 URL
     *
     * @param bucketName the bucket name
     * @param objectName the object name
     * @return the object url
     */
    String getObjectUrl(String bucketName, String objectName) throws Exception;

    /**
     *  删除对象
     *
     * @param bucketName the bucket name
     * @param objectName the object name
     */
    void removeObject(String bucketName, String objectName) throws Exception;

}

而后别离应用了以上两种 OSS 进行了实现。

并别离以 aliyunStorageminioStorage 为名称将 AliyunStorageMinioStorage注入Spring IoC

应用起来非常简单:

@Autowired
@Qualifier("minioStorage")
Storage storage;

@Test
public void testOss() throws Exception {File file = new File("./456.jpg");

    InputStream inputStream = new FileInputStream(file);

    storage.putObject("img","pic_122",inputStream, MimeTypeUtils.IMAGE_JPEG_VALUE);
}

5. 总结

明天的整合与平常不太一样,次要是一些通用性能的组件化封装的理论演示,另外简略形容了对象存储的性能和应用场景,心愿对你有用。多多关注:码农小胖哥, 跟我一起整合脚手架。

关注公众号:Felordcn 获取更多资讯

集体博客:https://felord.cn

正文完
 0