Minio

Minio是一款开源的分布式对象存储系统,它使用Go语言编写,具有分布式、高性能和高可用的特点。此外Minio还兼容S3协议,这意味着许多支持S3标准的客户端程序或软件包都可以和Minio结合使用。这篇笔记我们对Monio的搭建和使用进行简单介绍。

官方Github仓库:https://github.com/minio/minio

部署Minio程序

使用Docker部署

在开发环境中,我们可以使用Minio提供的Docker镜像在本地搭建一个单节点的Minio服务。执行下面代码拉取并运行Minio程序。

docker run -p 9000:9000 -p 9001:9001 --name minio -d -e "MINIO_ROOT_USER=root" -e "MINIO_ROOT_PASSWORD=abcd1234" minio/minio server /data --console-address ":9001"

命令中我们暴露了两个容器端口,9000端口用于向客户端提供OSS服务,9001端口是Minio的Web管理控制台界面服务,此外我们还设置了环境变量,MINIO_ROOT_USER指定了管理员用户名,MINIO_ROOT_PASSWORD指定了管理员密码,最后我们还设置了Minio的启动参数。

容器启动后,我们可以使用浏览器访问本机9001端口,如果Monio部署成功,我们可以看到管理控制台的登录界面。

配置Minio

部署完成后,要想使用Minio至少还需要配置两个东西,一个是需要创建accessKeysecretKey,另一个是需要创建存储桶。如果我们部署Minio时开启了Web管理控制台界面那么直接在界面上创建即可,非常简单,这里就不赘述了。

SpringBoot中使用Minio

Java工程中集成Minio其实有多种方式,Minio提供了自己的客户端库,此外我们也可以使用Amazon提供的S3客户端库,这两种方式都是可以的,而且代码也差不多。不过使用Amazon的S3客户端库有一个优势,那就是你可以很方便的在Minio和其它支持S3协议的商业或开源对象存储系统上随意切换而无需改动代码。下面例子中我们在SpringBoot2.7工程中配置使用S3客户端库。

首先我们引入Amazon的S3客户端库Maven依赖。

pom.xml

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.628</version>
</dependency>

SpringBoot工程的application.properties配置文件中我们添加一些自定义配置,稍后用于配置S3客户端。

application.properties

s3.accessKey=<your accessKey>
s3.secretKey=<your secretKey>
s3.endpoint=http://127.0.0.1:9000
s3.region=

S3Config.java是一个配置类,它读取了前面application.properties中的自定义配置,然后创建了一个AmazonS3客户端Bean并将其交给Spring的IoC容器托管,这样在其它位置我们使用S3客户端时直接依赖注入即可。

S3Config.java

package com.gacfox.demo.config;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class S3Config {
    @Value("${s3.accessKey}")
    private String accessKey;
    @Value("${s3.secretKey}")
    private String secretKey;
    @Value("${s3.endpoint}")
    private String endpoint;
    @Value("${s3.region}")
    private String region;

    @Bean
    public AmazonS3 amazonS3() {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        AWSStaticCredentialsProvider provider = new AWSStaticCredentialsProvider(credentials);
        ClientConfiguration configuration = new ClientConfiguration();
        AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(
                endpoint, region);
        return AmazonS3ClientBuilder.standard().withCredentials(provider)
                .withClientConfiguration(configuration.withProtocol(Protocol.HTTP).withSignerOverride("S3SignerType"))
                .withEndpointConfiguration(endpointConfiguration).build();
    }
}

FileController类中我们编写了一个简单的方法,它列出了存储桶中文件的fileKey

FileController.java

package com.gacfox.demo.controller;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.gacfox.demo.model.ApiResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class FileController {
    @Resource
    private AmazonS3 amazonS3;

    @GetMapping("/listFileKeys")
    public ApiResult<?> listFileKeys() {
        ObjectListing objectListing = amazonS3.listObjects("default");
        List<S3ObjectSummary> objectSummary = objectListing.getObjectSummaries();
        List<String> fileKeys = objectSummary.stream().map(S3ObjectSummary::getKey).collect(Collectors.toList());
        return ApiResult.success(fileKeys);
    }
}
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap