Minio是一款开源的分布式对象存储系统,它使用Go语言编写,具有分布式、高性能和高可用的特点。此外Minio还兼容S3协议,这意味着许多支持S3标准的客户端程序或软件包都可以和Minio结合使用。这篇笔记我们对Monio的搭建和使用进行简单介绍。
官方Github仓库:https://github.com/minio/minio
在开发环境中,我们可以使用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至少还需要配置两个东西,一个是需要创建accessKey
和secretKey
,另一个是需要创建存储桶。如果我们部署Minio时开启了Web管理控制台界面那么直接在界面上创建即可,非常简单,这里就不赘述了。
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);
}
}