1 前言
1.1 官方文檔和SDK
官方文檔:https://min.io/docs/minio/kubernetes/upstream/index.html?ref=docs-redirect
SDK:https://github.com/minio/minio-java
Minio 提供了多種語言的SDK,比如java、go、python等。JAVA開發(fā)平臺可以選擇JS和java SDK,也就是前端和后端都可以直接集成minio。
1.2 技術(shù)方案
每個OSS的用戶都會用到上傳服務。Web端常見的上傳方法是用戶在瀏覽器或App端上傳文件到應用服務器,應用服務器再把文件上傳到OSS。具體流程如下圖所示。
和數(shù)據(jù)直傳到OSS相比,以上方法有三個缺點:
-
上傳慢:用戶數(shù)據(jù)需先上傳到應用服務器,之后再上傳到OSS。網(wǎng)絡傳輸時間比直傳到OSS多一倍。如果用戶數(shù)據(jù)不通過應用服務器中轉(zhuǎn),而是直傳到OSS,速度將大大提升。而且OSS采用BGP帶寬,能保證各地各運營商之間的傳輸速度。
-
擴展性差:如果后續(xù)用戶多了,應用服務器會成為瓶頸。
-
費用高:需要準備多臺應用服務器。由于OSS上傳流量是免費的,如果數(shù)據(jù)直傳到OSS,不通過應用服務器,那么將能省下幾臺應用服務器。
目前通過Web前端技術(shù)上傳文件到OSS,有三種技術(shù)方案:
-
利用OSS js SDK將文件上傳到OSS,也就是前端直連OSS,但是容易暴露認證信息,安全性不太高。
-
使用表單上傳方式,將文件上傳到OSS。利用OSS提供的接口臨時接口,使用表單上傳方式將文件上傳到OSS。然后請求后端,告知上傳完成,進行后續(xù)處理。
-
先上傳到應用服務器,再請求OSS上傳,這種安全性較高,可以對數(shù)據(jù)和認證進行管控,但是性能最差。
2 集成 JAVA SDK
因為一般的非互聯(lián)網(wǎng)項目,對性能要求不高,所以采用JAVA SDK集成MInio,然后提供接口給Web端調(diào)用就行了。
2.1 環(huán)境搭建
首先搭建一個Maven基礎工程,引入相關依賴,這里引入的是最新的8.3.1版本。還引入了okhttp的最新包,不然某些API會提示版本太低。
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.2</version>
</dependency>
2.2 初始化客戶端
可以看到現(xiàn)在minio都是采用Builder構(gòu)建者模式來構(gòu)造對象,和之前有很大的區(qū)別,所以需要注意。
//url為地址,accessKey和secretKey為用戶名和密碼
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
2.3 存儲桶基礎操作
2.3.1 存儲桶是否存在
檢查存儲桶是否存在。
public boolean bucketExists(BucketExistsArgs args)
示例代碼:
/**
* 判斷桶是否存在
*/
public static boolean bucketExists(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
}
2.3.2 創(chuàng)建存儲桶
創(chuàng)建一個啟用給定區(qū)域和對象鎖定功能的存儲桶。
public void makeBucket(MakeBucketArgs args)
示例代碼:
/**
* 添加存儲桶
*/
public static void makeBucket(String url, String accessKey, String secretKey, String bucketName, String region, boolean objectLock)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).objectLock(objectLock).build());
}
創(chuàng)建后,就可以在控制臺看到這些存儲桶了,最后那個被鎖定的存儲桶,上傳文件及刪除后,發(fā)現(xiàn)還是會顯示存在這些對象,實際磁盤上的文件并沒有刪除
2.3.3 查詢存儲桶信息列表
列出所有桶的桶信息。
public List<Bucket> listBuckets()
示例代碼:
/**
* 查詢存儲桶信息列表
*/
public static List<Bucket> listBuckets(String url, String accessKey, String secretKey) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
return minioClient.listBuckets();
}
public static void main(String[] args) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
List<Bucket> buckets = listBuckets("url", "accessKey", "secretKey");
for (Bucket bucket : buckets) {
System.out.println(bucket.creationDate() + ", " + bucket.name());
}
}
打印信息如下,返回的創(chuàng)建時間是美國時間,需要注意。
2.3.4 刪除存儲桶
刪除一個空桶。
public void removeBucket(RemoveBucketArgs args)
示例代碼:
/**
* 刪除存儲桶
*/
public static void removeBucket(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
注意:要確保存儲桶存在,否則會報錯,刪除時最好調(diào)用bucketExists()方法判斷是否存在
2.4 設置存儲桶操作
2.4.1 加密配置
設置桶的加密配置,以允許在該桶中上傳對象時,采用對應加密配置對數(shù)據(jù)進行加密。當前支持配置的服務端加密方式為KMS托管密鑰的服務端加密(SSE-KMS),及AES256加密。
設置桶的加密配置:
public void setBucketEncryption(SetBucketEncryptionArgs args)
獲取桶的加密配置:
public SseConfiguration getBucketEncryption(GetBucketEncryptionArgs args)
2.4.2 生命周期
生命周期管理可適用于以下典型場景:
-
周期性上傳的日志文件,可能只需要保留一個星期或一個月。到期后要刪除它們。
-
某些文檔在一段時間內(nèi)經(jīng)常訪問,但是超過一定時間后便可能不再訪問了。這些文檔需要在一定時間后轉(zhuǎn)化為低頻訪問存儲,歸檔存儲或者刪除。
存儲桶生命周期配置:
public void setBucketLifecycle(SetBucketLifecycleArgs args)
獲取桶的生命周期配置:
public LifecycleConfiguration getBucketLifecycle(GetBucketLifecycleArgs args)
示例代碼:
// 5. 生命周期
List<LifecycleRule> rules = new LinkedList<>();
// 配置生命周期規(guī)則
rules.add(
new LifecycleRule(
Status.ENABLED, // 開啟狀態(tài)
null,
new Expiration((ZonedDateTime) null, 365, null), // 保存365天
new RuleFilter("logs/"), // 目錄配置
"rule2",
null,
null,
null));
LifecycleConfiguration lifecycleConfiguration = new LifecycleConfiguration(rules);
// 添加生命周期配置
minioClient.setBucketLifecycle(
SetBucketLifecycleArgs.builder().bucket("my-bucketname").config(lifecycleConfiguration).build());
// 獲取配置
LifecycleConfiguration lifecycleConfiguration1111 =
minioClient.getBucketLifecycle(
GetBucketLifecycleArgs.builder().bucket("my-bucketname").build());
List<LifecycleRule> rules1 = lifecycleConfiguration1111.rules();
for (int i = 0; i < rules1.size(); i++) {
System.out.println("Lifecycle status is " + rules1.get(i).status());
System.out.println("Lifecycle prefix is " + rules1.get(i).filter().prefix());
System.out.println("Lifecycle expiration days is " + rules1.get(i).expiration().days());
}
打印結(jié)果如下:
2.4.3 通知配置
可以使用存儲桶事件通知來監(jiān)控存儲桶中對象上發(fā)生的事件。
MinIO 服務器支持的各種事件類型有:
存儲桶配置通知:
public void setBucketPolicy(SetBucketPolicyArgs args)
獲取桶的通知配置:
public NotificationConfiguration getBucketNotification(GetBucketNotificationArgs args)
代碼示例:
// 6. 通知配置
// Add a new SQS configuration.
NotificationConfiguration notificationConfiguration = new NotificationConfiguration();
List<QueueConfiguration> queueConfigurationList = notificationConfiguration.queueConfigurationList();
QueueConfiguration queueConfiguration = new QueueConfiguration();
queueConfiguration.setQueue("arn:minio:sqs::1:webhook");
List<EventType> eventList = new LinkedList<>();
eventList.add(EventType.OBJECT_CREATED_PUT);
eventList.add(EventType.OBJECT_CREATED_COPY);
queueConfiguration.setEvents(eventList);
queueConfiguration.setPrefixRule("images");
queueConfiguration.setSuffixRule("pg");
queueConfigurationList.add(queueConfiguration);
notificationConfiguration.setQueueConfigurationList(queueConfigurationList);
// Set updated notification configuration.
minioClient.setBucketNotification(
SetBucketNotificationArgs.builder().bucket("my-bucketname").config(notificationConfiguration).build());
System.out.println("Bucket notification is set successfully");
NotificationConfiguration minioClientBucketNotification =
minioClient.getBucketNotification(
GetBucketNotificationArgs.builder().bucket("my-bucketname").build());
System.out.println(minioClientBucketNotification);
2.4.4 策略配置
添加存儲桶策略配置。
public void setBucketPolicy(SetBucketPolicyArgs args)
獲取桶的桶策略配置。
public String getBucketPolicy(GetBucketPolicyArgs args)
2.4.5 復制配置
存儲桶復制旨在將存儲桶中的選定對象復制到目標存儲桶,內(nèi)容較多,后續(xù)補上
添加存儲桶的復制配置
public void setBucketReplication(SetBucketReplicationArgs args)
獲取桶的桶復制配置:
public ReplicationConfiguration getBucketReplication(GetBucketReplicationArgs args)
2.4.6 存儲桶標簽
當為桶添加標簽時,該桶上所有請求產(chǎn)生的計費話單里都會帶上這些標簽,從而可以針對話單報表做分類篩選,進行更詳細的成本分析。例如:某個應用程序在運行過程會往桶里上傳數(shù)據(jù),我們可以用應用名稱作為標簽,設置到被使用的桶上。在分析話單時,就可以通過應用名稱的標簽來分析此應用的成本。
setBucketTags可以為存儲桶設置標簽。
public void setBucketTags(SetBucketTagsArgs args)
getBucketTags獲取桶的標簽。
public Tags getBucketTags(GetBucketTagsArgs args)
示例代碼:
// 1. 存儲桶標簽
Map<String, String> map = new HashMap<>();
map.put("Project", "Project One");
map.put("User", "jsmith");
// 設置標簽
minioClient.setBucketTags(SetBucketTagsArgs.builder().bucket("my-bucketname").tags(map).build());
// 查詢標簽
Tags bucketTags = minioClient.getBucketTags(GetBucketTagsArgs.builder().bucket("my-bucketname").build());
System.out.println(bucketTags.get().toString());
返回結(jié)果:
2.4.7 多版本設置
若開啟了多版本控制,上傳對象時,OBS自動為每個對象創(chuàng)建唯一的版本號。上傳同名的對象將以不同的版本號同時保存在OBS中。
若未開啟多版本控制,向同一個文件夾中上傳同名的對象時,新上傳的對象將覆蓋原有的對象。
某些功能(例如版本控制、對象鎖定和存儲桶復制)需要使用擦除編碼分布式部署 MinIO。開啟了版本控制后,允許在同一密鑰下保留同一對象的多個版本。
設置存儲桶的版本控制配置。
public void setBucketVersioning(SetBucketVersioningArgs args)
獲取存儲桶的版本控制配置。
public VersioningConfiguration getBucketVersioning(GetBucketVersioningArgs args)
代碼示例:
// 2. 版本配置
// 'my-bucketname'啟用版本控制
minioClient.setBucketVersioning(
SetBucketVersioningArgs.builder()
.bucket("my-bucketname")
.config(new VersioningConfiguration(VersioningConfiguration.Status.ENABLED, null))
.build());
System.out.println("Bucket versioning is enabled successfully");
// 'my-bucketname'暫停版本控制
minioClient.setBucketVersioning(
SetBucketVersioningArgs.builder()
.bucket("my-bucketname")
.config(new VersioningConfiguration(VersioningConfiguration.Status.SUSPENDED, null))
.build());
System.out.println("Bucket versioning is suspended successfully");
2.4.8 對象鎖定配置
對象鎖定設置后,刪除對象后,會仍然存在磁盤中。
在存儲桶中設置對象鎖定配置。
public void setObjectLockConfiguration(SetObjectLockConfigurationArgs args)
獲取存儲桶中的對象鎖配置。
public ObjectLockConfiguration getObjectLockConfiguration(GetObjectLockConfigurationArgs args)
需要先設置存儲桶為對象鎖定模式,示例代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-751912.html
// 3. 將保留模式設置為Compliance,且持續(xù)時間為100天
// 設置鎖定對象的保留模式及時限
ObjectLockConfiguration config =
new ObjectLockConfiguration(RetentionMode.COMPLIANCE, new RetentionDurationDays(100));
minioClient.setObjectLockConfiguration(
SetObjectLockConfigurationArgs.builder()
.bucket("my-bucketname-in-eu-with-object-lock")
.config(config)
.build());
System.out.println("object-lock configuration is set successfully");
// 獲取鎖定配置
ObjectLockConfiguration objectLockConfiguration =
minioClient.getObjectLockConfiguration(
GetObjectLockConfigurationArgs.builder()
.bucket("my-lock-enabled-bucketname")
.build());
System.out.println("Object-lock configuration of bucket");
System.out.println("Mode: " + objectLockConfiguration.mode());
System.out.println("Duration: " + objectLockConfiguration.duration());
2.5 刪除配置
minio提供了一些列的delete方法用于刪除配置,比較簡單,就不舉例說明了。文章來源地址http://www.zghlxwxcb.cn/news/detail-751912.html
2.5.1 刪除桶的加密配置
public void deleteBucketEncryption(DeleteBucketEncryptionArgs args)
2.5.2 刪除存儲桶的生命周期配置
public void deleteBucketLifecycle(DeleteBucketLifecycleArgs args)
2.5.3 刪除桶的標簽
public void deleteBucketTags(DeleteBucketTagsArgs args)
2.5.4 刪除桶的桶策略配置
public void deleteBucketPolicy(DeleteBucketPolicyArgs args)
2.5.5 刪除存儲桶的存儲桶復制配置
public void deleteBucketReplication(DeleteBucketReplicationArgs args)
2.5.6 刪除桶的通知配置
public void deleteBucketNotification(DeleteBucketNotificationArgs args)
3 相關工具類
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.Bucket;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
* minio工具類
*
* @author wuKeFan
* @date 2023-09-08 14:08:10
*/
public class MinioUtil {
/**
* 判斷桶是否存在
*/
public static boolean bucketExists(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
}
/**
* 添加存儲桶
*/
public static void makeBucket(String url, String accessKey, String secretKey, String bucketName, String region, boolean objectLock)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).objectLock(objectLock).build());
}
/**
* 指定地區(qū)添加存儲桶
*/
public static void makeBucket(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
/**
* 指定地區(qū)添加存儲桶并鎖定對象
*/
public static void makeBucket(String url, String accessKey, String secretKey, String bucketName, String region)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).build());
}
/**
* 刪除存儲桶
*/
public static void removeBucket(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
/**
* 設置桶公有
*/
public static void setBucketPublicPolicy(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
String sb = "{\"Version\":\"2012-10-17\"," +
"\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" +
"{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," +
"\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName +
"\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" +
bucketName +
"/*\"]}]}";
minioClient.setBucketPolicy(
SetBucketPolicyArgs.builder()
.bucket(bucketName)
.config(sb)
.build());
}
/**
* 設置桶私有
*/
public static void setBucketPrivatePolicy(String url, String accessKey, String secretKey, String bucketName)
throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
minioClient.setBucketPolicy(
SetBucketPolicyArgs.builder().bucket(bucketName)
.config(
"{\"Version\":\"2012-10-17\",\"Statement\":[]}"
)
.build());
}
/**
* 查詢存儲桶信息列表
*/
public static List<Bucket> listBuckets(String url, String accessKey, String secretKey) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
return minioClient.listBuckets();
}
}
到了這里,關于Minio入門系列【5】JAVA集成Minio之存儲桶操作API使用詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!