MinIO
этона основеApache License v2.0
Объекты соглашения об открытом исходном кодехранилище Служить。он совместим с амазонкойS3облакохранилище Служитьинтерфейс,Идеально подходит для хранения больших объемов неструктурированных данных.,Например, изображения, видео, файлы журналов, резервные данные, образы контейнеров/виртуальных машин и т. д.,Объектный файл может иметь любой размер.,Размер от нескольких Кб до максимум 5Т.
MinIO
очень легкий Служить,Легко комбинируется с другими приложениями.,похожий NodeJS
, Redis
или MySQL
。
Официальная документация:
MinIO
Кластеры могут образовывать федерации,и сформировать глобальное пространство имен,и в нескольких центрах обработки данныхK8S
договоренность、Мультитенантная поддержкаAmazon S3
совместимый:Minio
использоватьAmazon S3 v2 / v4 API
。МожетиспользоватьMinio SDK
,Minio Client
,AWS SDK
иAWS CLI
доступMinio
Служитьустройство。
Minio
собственная файловая система,Также поддерживаетDAS
、 JBODs
、NAS
、GoogleоблакохранилищеиAzure Blobхранилище。SDK
поддерживать: на основеMinio
Легкие функции,Он поддерживается SDK для таких языков, как Java, Python или Go.Minio
Служитьустройствочерез егосовместимыйAWS SNS / SQS
уведомление о событии СлужитькурокLambdaФункция。поддерживать Целью является очередь сообщений.,нравитьсяKafka,NATS,AMQP,MQTT,Вебхуки и Elasticsearch,Redis,Postgres
иMySQL
ждатьданные Библиотека。
MinIO
меньше подвержен ошибкам、Начни быстрееMinIO
использоватьстирающее кодирование、Checksum
для предотвращения аппаратных ошибокитишинаданныезагрязнять。В конфигурации с наивысшим резервированием,Данные можно восстановить, даже если потеряно 1/2 диска!
Minio
использоватьстирающее кодированиеerasure code
иКонтрольная сумма
。 Даже если половина количества (N/2) жестких дисков будет утеряна, данные все равно можно восстановить.。
Стирающее кодирование — это математический алгоритм восстановления потерянных и поврежденных данных.
Вытащите изображение
docker pull minio/minio
Позже проверьте, было ли изображение успешно извлечено.
docker images
Запустите контейнер MinIO:
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123456" \
-v /home/data:/data \
-v /home/config:/root/.minio \
minio/minio server /data --console-address ":9001"
Просматриватьустройстводоступ:http://localhost:192.168.159.141:9000/minio/login
Мы тамконтейнер Имя пользователя, указанное в команде запускаadmin
,Парольadmin123456
,Войдите сюда и нажмите, чтобы войти,Основной интерфейс выглядит следующим образом
Вы можете увидеть здесь Ведра, потому что я создал их раньше.
Справочная документация:
https://docs.min.io/docs/java-client-api-reference.html
Добавьте следующие зависимости в свой собственный микросервисный модуль:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.0</version>
</dependency>
minio:
endpointUrl: http://192.168.159.141:9000
accessKey: admin
secreKey: admin123456
bucketName: gmall
Я написал файл конфигурации здесь, в центре конфигурации Nacos.
@Api(tags = «Контроллер загрузки файлов»)
@RestController
@RequestMapping("/admin/product")
public class FileUploadController {
//Читаем конфигурацию в файле конфигурации
@Value("${minio.endpointUrl}")
private String endpointUrl;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secreKey}")
private String secreKey;
@Value("${minio.bucketName}")
private String bucketName;
@ApiOperation("Загрузка файла MinIO")
@PostMapping("/fileUpload")
public Result fileUpload(MultipartFile file) {
String url="";
try {
// Создать клиентский объект minioClient
MinioClient minioClient =
MinioClient.builder()
.endpoint(endpointUrl)
.credentials(accessKey, secreKey)
.build();
// Определить, существует ли указанный сегмент
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 fileName = System.currentTimeMillis() + UUID.randomUUID().toString();
minioClient.putObject(
PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build());
//Соединяем путь к файлу
url=endpointUrl+"/"+bucketName+"/"+fileName;
System.out.println("Путь к изображению:"+url);
} catch (Exception e) {
e.printStackTrace();
}
return Result.ok(url);
}
}
Этот контроллер сначала проверяет наличие бакетов (сегментов хранения). Если нет, сначала создайте их, а затем выполните операцию загрузки файла. Наконец, нашему контроллеру необходимо вернуть путь доступа к изображению во внешний интерфейс.
На самом деле, этот шаг в основном завершен. Я не буду включать последующий бизнес-код, а буду напрямую использовать Swagger UI, чтобы протестировать его и показать эффект.
Выберите изображение и нажмите, чтобы загрузить. Результаты ответа следующие:
можно увидеть,data
Свойство возвращает наше изображениедоступпуть
Мы получаем доступ к этому URL-адресу непосредственно в браузере.
Как видите, проблем нет.
Мы также можем найти изображение, которое мы только что загрузили в Buckets.
Ладно, пока, Объектное хранилище Представлено базовое использование MinIO. Осталось написать злой код на базе собственного бизнеса. На самом деле, если вам слишком сложно создать службу объектного хранения самостоятельно, я уже писал статьи об Alibaba Cloud OSS и Tencent Cloud OSS, и эти методы также очень удобны.