Серия статей:
Хранилище объектов — предварительное исследование Minio
Хранилище объектов — предварительное исследование В Minio мы представили процесс развертывания MinIO на одной машине, а также некоторые операции на консоли. Поскольку в реальных приложениях операции в основном выполняются через SDK, поэтому здесь мы также начинаем вводить MinIO. Использование SDK. Мин ИО Адрес официального сайта SDK: https://min.io/docs/minio/linux/developers/minio-drivers.html?ref=docs. Как видно из этого, MinIO выпустила SDK на 6 языках: .NET, Golang, Haskell, Java, JavaScript и Python. Далее мы будем использовать Java. SDK для реализации некоторых распространенных операций на MinIO.
На данный момент (2023.12.22) версия Java SDK — 8.5.7, адрес github: minio/minio-java.
Как и другие зависимости, он поддерживает прямое внедрение пакетов maven, gradle и jar. Давайте возьмем Maven в качестве примера:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
Это официальный пример. Для загрузки файлов на сервер minio требуются следующие три параметра:
Конечная точка: URL-адрес службы S3.
Ключ доступа: ak учетной записи minio.
Секретный ключ: ск Минио.
Способ создания/запроса ak и sk см. на снимке экрана ниже. В разделе «Учетные записи служб» нажмите кнопку «Создать учетную запись службы», чтобы создать учетную запись.
На этой странице скопируйте ключ доступа и секретный ключ и сохраните их.
2.2.2 Официальная информация о сервисе тестирования
Обратите внимание: если служба minio не была собрана локально, вы можете сначала использовать два адреса тестовой службы, указанные в официальной документации:
MinIO:
MinioClient minioClient =
MinioClient.builder()
.endpoint("https://play.min.io")
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
.build();
AWS S3:
MinioClient minioClient =
MinioClient.builder()
.endpoint("https://s3.amazonaws.com")
.credentials("YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY")
.build();
package com.freemark.demo.minio;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class FileUploader {
/**
* Настройте здесь свою собственную конечную точку sk
*/
public static String endPoint = "http://ваш минио server ip:номер порта";
public static String accessKey = «твой ак»;
public static String secretKey = "ваш ск";
public static void main(String[] args)
throws IOException, NoSuchAlgorithmException, InvalidKeyException {
try {
// Создайте minioClient и используйте официальный адрес примера iak. sk
MinioClient minioClient =
MinioClient.builder()
.endpoint("https://play.min.io")
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
.build();
// Если указанный сегмент не существует, создайте его, в противном случае используйте существующий сегмент.
String bucketName = "asiatrip1";
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
} else {
System.out.println("Bucket '" + bucketName + "' already exists.");
}
String filePath = "/Users/lijingyong/Downloads/minio_test_text.txt";
String fileName = "minio_test_text.txt";
// Выполнить загрузку файла
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.filename(filePath)
.build());
System.out.println("'" + filePath + "' Объект успешно загружен '" + fileName + "' приезжать bucket '" + bucketName + "'.");
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
System.out.println("HTTP trace: " + e.httpTrace());
}
}
}
После выполнения распечатывается следующая информация:
Если вы используете адрес сервиса minio и соответствующие ак и ск, которые вы создали сами, то мы видим, что только что загруженный нами файл находится под указанным бакетом. Как показано ниже:
Если вы выполните его несколько раз, вы обнаружите, что корзина уже существует и не будет создаваться повторно, но файл будет загружен несколько раз, перезаписав загрузку.
Для других полных API мы также можем просмотреть официальную документацию: https://min.io/docs/minio/linux/developers/java/API.html#bucketExists. Ниже приведен пример загрузки и удаления файлов, которые могут часто использоваться. Остальные могут просмотреть документацию и не будут здесь вдаваться в подробности.
Имя метода: DownloadObject
Вход:DownloadObjectArgs,Список параметров:
ведро: из какого ведра загрузить файл
объект: имя объекта, который будет загружен
имя файла: путь к файлу для сохранения
Используйте следующий код для загрузки указанного объекта в указанную корзину. Загруженный файл будет сохранен по пути, соответствующему параметру имени файла.
minioClient.downloadObject(
DownloadObjectArgs.builder()
.bucket("my-bucketname")
.object("my-objectname")
.filename("my-object-file")
.build());
Если файл на стороне сервера зашифрован, нам также необходимо добавить параметр ssec при загрузке для его поддержки.
ServerSideEncryptionCustomerKey ssec =
new ServerSideEncryptionCustomerKey(
new SecretKeySpec(
"01234567890123456789012345678901".getBytes(StandardCharsets.UTF_8), "AES"));
minioClient.downloadObject(
DownloadObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.filename("/Users/xxx/Downloads/download_minio_test_text.txt")
.ssec(ssec)
.build());
System.out.println(fileName + «Загрузка завершена»);
Обратите внимание: если используемый нами minio не установлен как служба с TLS, при выполнении приведенного выше кода будет сообщено о следующей ошибке.
Шифрование на стороне сервера Minio не упоминается в большинстве статей, поэтому здесь мы его немного объясним.
ссылкаMinio Cookbook Китайская версия Как использовать aws-cli для вызова Шифрование в на стороне сервера Minio,MinioПоддерживает использование секретного ключа, предоставленного клиентом.(SSE-C)руководитьS3Сервершифрование。клиентдолжендляSSE-CПросьба указать триHTTPЗаголовок запроса:
1. Идентификатор алгоритма. Единственное допустимое значение X-Amz-Server-Side-Encryption-Customer-Algorithm: AES256.
2. Ключ шифрования: X-Amz-Server-Side-Encryption-Customer-Keyшифрованиесекретный ключдолжендаодининдивидуальный256кусочекbase64закодированная строка。
3. Контрольная сумма ключа шифрования MD5: X-Amz-Server-Side-Encryption-Customer-Key-MD5шифрованиеключMD5проверятьидолжендасекретный ключизMD5и,Обратите внимание, что это MD5 исходного ключа.,И после кодировки нетbase64.
minioПри установке вам необходимо установить его с помощьюTLSиз Служить。Скачать отсюдаMinio Сервер, способы установки см. в документе «Сеть». Encryption (TLS) Создать сертификат.
Здесь необходимо отметить, что если вы используете самозаверяющий сертификат TLS, то при переходе в Minio Когда Сервер загружает файлы,Такие инструменты, как aws-cli или mc, сообщают об ошибках. Если вы хотите получить сертификат TLS, подписанный структурой CA,пожалуйстассылкаLet's Encrypt
。Подпишите себяиз Сертификат должен делать толькодля Внутреннее развитиеитест。
Загрузите и установите aws-cli отсюда.
Предположим, у вас есть Minio, работающий локально. Server,адресдаhttps://localhost:9000
,И используйте самоподписанный сертификат. Для обхода проверки TLS сертификатов,Вам нужно указать—no-verify-ssl
。если тыизMinio ServerиспользоватьиздаодининдивидуальныйCAСертификацияиз Сертификат,а тынавсегда навсегдаНе указывать`—no-verify-ssl,В противном случае aws-cli примет любой сертификат.
Используйте метод removeObject для поддержки удаления одного объекта.
// Remove object.
minioClient.removeObject(
RemoveObjectArgs.builder().bucket("my-bucketname").
object("my-objectname").build());
Удалить версию указанного объекта:
// Remove versioned object.
minioClient.removeObject(
RemoveObjectArgs.builder()
.bucket("my-bucketname")
.object("my-versioned-objectname")
.versionId("my-versionid")
.build());
Чтобы удалить версионные объекты в обход режима управления:
// Remove versioned object bypassing Governance mode.
minioClient.removeObject(
RemoveObjectArgs.builder()
.bucket("my-bucketname")
.object("my-versioned-objectname")
.versionId("my-versionid")
.bypassRetentionMode(true)
.build());
Используйте RemoveObjects, параметр представляет собой список объектов:
List<DeleteObject> objects = new LinkedList<>();
objects.add(new DeleteObject("my-objectname1"));
objects.add(new DeleteObject("my-objectname2"));
objects.add(new DeleteObject("my-objectname3"));
Iterable<Result<DeleteError>> results =
minioClient.removeObjects(
RemoveObjectsArgs.builder().bucket("my-bucketname").objects(objects).build());
for (Result<DeleteError> result : results) {
DeleteError error = result.get();
System.out.println(
"Error in deleting object " + error.objectName() + "; " + error.message());
}
Другие часто используемые API включают получение списка файлов в сегменте: listObjects, настройку жизненного цикла сегмента: setBucketLifecycle и т. д. Поскольку это описано в официальной документации API и классах инструментов, представленных в других статьях, я не буду здесь вдаваться в подробности. Вы можете просмотреть код инструмента по адресу https://gitee.com/flamingskyline/template-engine и загрузить его.