Minio
部署MinIO
在server01
部署MinIO,安装方式采用rpm离线安装,具体步骤可参考官方文档。
-
获取MinIO安装包
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm
注:若下载缓慢,大家可直接使用课程资料中附带的安装包
-
安装MinIO
rpm -ivh minio-20230809233022.0.0.x86_64.rpm
-
集成Systemd
-
Systemd概述
Systemd
是一个广泛应用于Linux系统的系统初始化和服务管理器,其可以管理系统中的各种服务和进程,包括启动、停止和重启服务,除此之外,其还可以监测各服务的运行状态,并在服务异常退出时,自动拉起服务,以保证服务的稳定性。系统自带的防火墙服务firewalld
,我们自己安装的mysqld
和redis
均是由Systemd
进行管理的,此处将MinIO服务也交给Systemd管理。 -
编写MinIO服务配置文件
Systemd所管理的服务需要由一个配置文件进行描述,这些配置文件均位于
/etc/systemd/system/
或者/usr/lib/systemd/system/
目录下,下面创建MinIO服务的配置文件。执行以下命令创建并打开
minio.service
文件vim /etc/systemd/system/minio.service
内容如下,具体可参考MinIO官方文档。
[Unit] Description=MinIO Documentation=https://min.io/docs/minio/linux/index.html Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/bin/minio [Service] WorkingDirectory=/usr/local ProtectProc=invisible EnvironmentFile=-/etc/default/minio ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi" ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES Restart=always LimitNOFILE=65536 TasksMax=infinity TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target
注意:
重点关注上述文件中的以下内容即可
EnvironmentFile
,该文件中可配置MinIO服务所需的各项参数ExecStart
,该参数用于配置MinIO服务的启动命令,其中$MINIO_OPTS
、$MINIO_VOLUMES
,均引用于EnvironmentFile
中的变量。MINIO_OPTS
用于配置MinIO服务的启动选项,可省略不配置。MINIO_VOLUMES
用于配置MinIO服务的数据存储路径。
Restart
,表示自动重启
-
编写
EnvironmentFile
文件执行以下命令创建并打开
/etc/default/minio
文件vim /etc/default/minio
内容如下,具体可参考官方文档。
MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin MINIO_VOLUMES=/data MINIO_OPTS="--console-address :9001"
注意
-
MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
为用于访问MinIO的用户名和密码,密码长度至少8位。 -
MINIO_VOLUMES
用于指定数据存储路径,需确保指定的路径是存在的,可执行以下命令创建该路径。mkdir /data
-
MINIO_OPTS
中的console-address
,用于指定管理页面的地址。
-
-
-
启动MinIO
执行以下命令启动MinIO
systemctl start minio
执行以下命令查询运行状态
systemctl status minio
设置MinIO开机自启
systemctl enable minio
-
访问MinIO管理页面
管理页面的访问地址为:
http://192.168.10.101:9001
注意:
ip
需要根据实际情况做出修改
MinIO核心概念
下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。
-
对象(Object)
对象是实际的数据单元,例如我们上传的一个图片。
-
存储桶(Bucket)
存储桶是用于组织对象的命名空间,类似于文件夹。每个存储桶可以包含多个对象。
-
端点(Endpoint)
端点是MinIO服务器的网络地址,用于访问存储桶和对象,例如
http://192.168.10.101:9000
注意:
9000
为MinIO的API的默认端口,前边配置的9001
以为管理页面端口。 -
Access Key 和 Secret Key
Access Key是用于标识和验证访问者身份的唯一标识符,相当于用户名。
Secret Key是与Access Key关联的密码,用于验证访问者的身份。
MinIO管理页面操作
-
登录
管理页面的地址为http://192.168.10.101:9001,登录的用户名和密码为部署时在
EnvironmentFile
文件中配置的如下参数MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin
-
创建存储桶
-
上传图片
-
找到目标桶
-
-
上传图片
-
-
访问图片
-
图片URL
由于MinIO提供了HTTP访问功能,所以可以通过浏览器直接访问对象。对象URL为MinIO的
Endpoint
+对象的存储路径
例如下图中的图片对象的URL为http:192.168.10.101:9000/test/公寓-外观.jpg。
-
-
访问权限
不出意外的话,使用浏览器访问上述URL,会得到如下响应,很显然是没有访问权限。
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
<Key>公寓-外观.jpg</Key>
<BucketName>test</BucketName>
<Resource>/test/公寓-外观.jpg</Resource>
<RequestId>177BC92022FC5684</RequestId>
<HostId>dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8</HostId>
</Error>
若想继续访问图片,需要修改图片所在桶的访问权限,如下图所示
如上图所示,可选的访问权限共有三个选项,分别是Private
、Public
和Custom
,具体说明如下
-
Private
只允许桶的所有者对该桶进行读写。
-
Public
允许所有人对该桶进行读写。
-
Custom
自定义访问权限。
若想将权限设置为只允许所有者写,但允许所有人读,就需要自定义访问权限。自定义访问权限,需要使用一个规定格式的JSON字符串进行描述,具体格式可参考官方文档。
例如以下JSON字符串表达的含义是:允许(Allow
)所有人(*
)读取(s3:GetObject
)指定桶(test
)的所有内容。
{
"Statement" : [ {
"Action" : "s3:GetObject",
"Effect" : "Allow",
"Principal" : "*",
"Resource" : "arn:aws:s3:::test/*"
} ],
"Version" : "2012-10-17"
}
将test
桶访问权限设置为Custom
,并添加上述内容
重新访问http:192.168.10.101:9000/test/公寓-外观.jpg,观察是否正常。
MinIO Java SDK
MinIO提供了多种语言的SDK供开发者使用,本项目需要用到Java SDK,下面通过一个简单案例熟悉一下其基本用法,具体内容可参考官方文档。
创建一个Maven项目
引入如下依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.3</version>
</dependency>
编写如下内容
连接Minio==>名称为client
@Test
public void test01(){
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
System.out.println("build = " + client);
}
创建bucket桶==>名称为hello-minio
@Test
public void test02() throws Exception{
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
System.out.println("build = " + client);
String bucketName = "hello-minio"; //bucket桶名称
BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder()
.bucket(bucketName)
.build();
boolean flag = client.bucketExists(bucketExistsArgs);
if(!flag){
MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder()
.bucket(bucketName)
.build();
//创建bucket桶
client.makeBucket(makeBucketArgs);
System.out.println("创建成功");
}else{
System.out.println("已存在");
}
}
配置策略==>
@Test
public void test03() throws Exception{
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
System.out.println("build = " + client);
String bucketName = "hello-minio"; //bucket桶名称
String config =
"""
{
"Statement" : [ {
"Action" : "s3:GetObject",
"Effect" : "Allow",
"Principal" : "*",
"Resource" : "arn:aws:s3:::%s/*"
} ],
"Version" : "2012-10-17"
}
""".formatted("kunkun");
SetBucketPolicyArgs policy = SetBucketPolicyArgs.builder()
.bucket(bucketName)
.config(config)
.build();
//配置策略
client.setBucketPolicy(policy);
}
object类型文件上传与删除
@Test
//上传文件
public void test04() throws Exception{
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
System.out.println("build = " + client);
String bucketName = "hello-minio"; //bucket桶名称
String resource = "d:/img/web.jpg"
UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
.bucket(bucketName)
.object("流程图.jpg") //上传后的文件名
.filename(resource) //被上传文件现在所在的位置
.build();
//上传文件
client.uploadObject(uploadObjectArgs);
System.out.println("文件上传成功");
}
@Test
//删除minIO中的文件
public void test05() throws Exception{
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
System.out.println("build = " + client);
//删除minIO中的文件
String bucketName = "hello-minio"; //bucket桶名称
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder()
.bucket(bucketName)
.object("流程图.jpg") //要删除的文件名
.build();
client.removeObject(removeObjectArgs);
System.out.println("删除图片成功!!!");
}
流类型文件上传与删除
public void test04() throws Exception{
try {
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
String bucketName = "hello-minio"; //bucket桶名称
String objectKey = "your-object-name.txt";
String content = "Hello, this is a sample file.";
InputStream inputStream = new ByteArrayInputStream(content.getBytes());
// 上传文件
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(objectKey)
.stream(inputStream, inputStream.available(), -1) // -1表示流的长度未确定
.contentType("text/plain")
.build()
);
} catch (Exception e) {
e.printStackTrace();
}
}
删除bucket桶
//删除minIO中的bucket
public void test06() throws Exception{
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.126.128:9000")
.credentials("minioadmin","minioadmin")
.build();
System.out.println("build = " + client);
//删除minIO中的bucket
String bucketName = "hello-minio"; //bucket桶名称
RemoveBucketArgs removeBucketArgs = RemoveBucketArgs.builder().bucket(bucketName).build();
//删除minIO中的bucket
client.removeBucket(removeBucketArgs);
System.out.println("已删除bucket");
}
注意:client对象是=>MinioClient的对象
运行测试
运行上述代码,然后查看MinIO管理页面,观察是否上传成功。
关于文本字符串中的转义字符
SpringBoot 整合 Minio
创建一个spring Boot项目
引入依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.3</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
</dependency>
<!-- 操作minio的java客户端-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
编写配置文件在
application.yml
文件中编写相关配置。
#minio没有提示;只是在配置文件中创建变量,方便使用
minio:
host: http://IP:9000 #Minio服务器的ip地址
access-key: minioadmin
secret-key: minioadmin
bucket-name: myBucket
url: ${minio.host}/${minio.bucket}/ #url+bucket桶名 访问地址
创建Minio的配置类:
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.minio") //配置类与配置文件绑定,并自动映射赋值
public class MinioConfig {
private String accessKey;
private String secretKey;
private String url;
private String bucketName;
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(url)
.credentials(accessKey,secretKey)
.build();
}
}
标签:MinIO,minioadmin,minio,bucket,client,build,Minio From: https://www.cnblogs.com/21CHS/p/18528855编写minio工具类