Если вы хотите создать элегантную, простую и полнофункциональную службу статических ресурсов, используйте MinIO.
1. Введение
В процессе разработки веб-проекта часто возникает необходимость обработки статических ресурсов (таких как картинки, видео, аудио, js-библиотеки, css-библиотеки и т. д.) Вообще говоря, если эти файлы ресурсов нужны в проекте, мы обычно используют следующие методы:
- Локальное хранилище: то есть в статическом каталоге проекта создайте каталоги, такие как js/css/icon/font/image/lib/audio/video, и сохраните файлы ресурсов в соответствующем формате соответственно. При использовании используйте ссылки относительного положения в файле html.
- Используйте прокси для создания статической службы ресурсов: то есть храните ресурсы в каталоге файлов, используйте прокси-сервер (например, nginx, apache и т. д.) для сопоставления каталога для создания службы ресурсов. При использовании ссылайтесь на URL-адрес прокси-сервиса в html-файле.
- Используйте сторонние инструменты для создания служб статических ресурсов: используйте сторонние инструменты для хранения файлов или объектов с открытым исходным кодом или сами напишите программу для реализации интерфейса, который может получать файлы. При использовании используйте соответствующий URL-адрес или адрес интерфейса.
- Используйте онлайн-сервисы статических ресурсов: такие как CDN и другие сервисы.
Для локального хранилища недостаток очевиден, ресурсы и файлы кода перемешаны между собой, что ненужно и неудобно расширять. Для приложений, развернутых локально, очевидно, безопаснее создавать службы статических ресурсов самостоятельно. Для сравнения, для использования прокси-сервисов и сторонних инструментов прокси-сервис выполняет только сопоставление.Хотя он доступен, он имеет одну функцию, выполняет только сопоставление и не имеет других функций управления, и его нелегко расширять. Используя сторонние инструменты хранения файлов или объектов, вы можете управлять файлами и учитывать такие факторы, как высокое расширение, высокая производительность и высокая доступность, поэтому это хороший выбор.Среди них MinIO — такой полезный инструмент хранения объектов.Простой, быстро и полнофункционально.
В этой статье создаются службы статических ресурсов с помощью установки, настройки и использования MinIO, чтобы независимо развертывать и получать доступ к таким ресурсам, как изображения, видео, аудио и сторонние библиотеки js; также кратко рассказывается об использовании предоставленного Java API. от MinIO для дальнейшего развития.
2 Введение в MinIO
в соответствии сMinIOСогласно официальному представлению, MinIO — это высокопроизводительное хранилище объектов (разницу между хранилищем блоков, хранилищем файлов и хранилищем объектов см.Распределенные решения для хранения объектов, знакомые архитекторам), совместимый с интерфейсом Amazon S3, полностью учитывающий потребности и опыт разработчиков; поддерживающий распределенное хранилище с высокой масштабируемостью и высокой доступностью; простое развертывание, но богатый функциями. Официальная документация также очень подробная. Он имеет несколько различных режимов развертывания (развертывание на одном компьютере, распределенное развертывание). Причина, по которой MinIO проста в использовании, заключается в том, что ее легко запустить, запустить и настроить. Его можно установить и запустить через докер или скачать бинарный файл и запустить с помощью скрипта.
Эта статья объясняется самым простым способом: на Linux-машине, развертывание на одной машине, запуск бинарных файлов.
3 Работа MinIO и использование статических ресурсов
3.1 Приобретение MinIO
Документация по разработке MinIO, адрес загрузки выглядит следующим образом:
- linux:
https://dl.min.io/server/minio/release/linux-amd64/minio
- windows:
https://dl.min.io/server/minio/release/windows-amd64/minio.exe
Эта статья работает в Linux.
3.2 Запуск и запуск MinIO
3.2.1 Простой запуск переднего плана
Сохраните загруженный файл minio в каталоге в качестве рабочего каталога (например, /opt/minio) и создайте новый каталог (например, /opt/minio-data) в качестве места хранения данных minio для запуска следующим образом:
cd /opt/minio
chmod +x minio
./minio server /opt/minio-data
После запуска будет выведена конечная точка адреса доступа и соответствующий ключ доступа и секретный ключ.Используйте браузер для доступа к адресу конечной точки.Если к нему можно получить доступ, это означает, что minio был успешно установлен. Однако у этого стартапа есть несколько недостатков:
- не работает в фоновом режиме,
ctrl+c
завершит процесс, и служба остановится - Нет пользовательского имени пользователя и пароля для доступа
- Не указан IP-адрес доступа и порт
- журнал не сохраняется в файл
Для этих проблем рекомендуется использовать следующие методы запуска и запуска.
3.2.2 Запуск с заданными параметрами в фоновом режиме
использоватьnohup
Запустите программу в фоновом режиме, указав параметры пароля, параметры адреса доступа и вывод журнала, как показано ниже.
MINIO_ACCESS_KEY=minio MINIO_SECRET_KEY=minio123 nohup /opt/minio/minio server --address "${MINIO_HOST}:${MINIO_PORT}" /opt/minio-data > /opt/minio/minio.log 2>&1 &
MINIO_ACCESS_KEY
иMINIO_SECRET_KEY
это код доступа
${MINIO_HOST}:${MINIO_PORT}
Это хост и порт для доступа, пожалуйста, измените их в соответствии с реальной ситуацией.
Таким образом, доступ к адресу через браузер${MINIO_HOST}:${MINIO_PORT}
, используя указанныйMINIO_ACCESS_KEY
иMINIO_SECRET_KEY
Просто войдите в систему.
3.2.3 Создайте ведро и укажите политику доступа
Войдите в систему хранения MinIO в браузере, нажмите, чтобы создать корзину в правом нижнем углу для хранения объектов, и создайте соответствующие корзины для хранения статических ресурсов: изображения, видео, аудио. Таким образом, файлы могут быть загружены в соответствующее ведро в соответствии с типом ресурса.После загрузки файлы могут быть переданы в общий доступ, а другие места могут получать ресурсы через общий URL-адрес, как показано на следующем рисунке.
Политика MinIO по умолчанию заключается в том, что эффективное время обмена адресами составляет не более дней 7. Чтобы нарушить этот лимит, вы можете установить политику в корзине. Щелкните соответствующее ведро ,edit policy
Добавить политику*.*
,Read Only
,следующее:
Это освобождает доступ без ограничения по времени и просто нажимаетhttp://${MINIO_HOST}:${MINIO_PORT}/${bucketName}/${fileName}
Вы можете получить прямой доступ к ресурсу (операция совместного использования не требуется).
Мифы о каталоге MinIO
- На самом деле, для объектного хранилища нет различия между файлами и каталогами, все файлы и каталоги являются объектами, то есть image/temp/xxx.jpg и image/temp/ оба являются объектами. Она принципиально отличается от древовидной структуры файловой системы операционной системы.
- При загрузке файла имя_объекта может быть
/temp/xxx.jpg
, можно считать, что система автоматически создала временную директорию.- MinIO не поддерживает такие операции, как удаление каталога и одновременное удаление всех файлов в этом каталоге (т.
rm -rf image/temp
), поэтому чтобы удалить изображение / TEMP Directory / Temp, вам нужно удалить все файлы, префиксные с изображением / темп.- При запросе нескольких файлов вы можете использовать сопоставление префиксов, чтобы получить их, см. документацию по API.
listObjects(bucketName, prefix, recursive)
3.3 Ссылки на статические ресурсы в html-файлах
Благодаря вышеуказанным настройкам и операциям MinIO был завершен как сервер статических ресурсов, и вы можете написать html для ссылки на статические ресурсы в MinIO. Ниже приведены изображение, видео и аудио в протестированном html с использованием адреса ресурса MinIO.
<div class="img-list">
<img src="http://${MINIO_HOST}:${MINIO_PORT}/image/test.jpg" alt="图片">
</div>
<div class="audio-list">
<audio src="http://${MINIO_HOST}:${MINIO_PORT}/audio/test.mp3"
controls="controls"></audio>
</div>
<div class="video-list">
<video src="http://${MINIO_HOST}:${MINIO_PORT}/video/test.mp4" controls="controls"></video>
</div>
Доступные для обнаружения ресурсы могут быть загружены и доступны в обычном режиме.
4 операции клиентского API Java
MinIO очень дружелюбен к разработчикам и предоставляет интерфейсы работы с API на разных языках.Документация по разработке MinIO. Давайте возьмем Java в качестве примера для проведения теста.
4.1 Добавить зависимости
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>6.0.13</version>
</dependency>
4.2 Использование Java API для операций с файлами
Создайте клиент операции для MinIOminioClient = new MinioClient(endpoint, accessKey, secretKey);
, в параметреendpoint
Это адрес доступа к минимуму, установлен, когда соответствующие два заднего пароля загрузочного пароля.
4.2.1 Загрузка файлов
/**
* 上传文件
* @param minioClient 操作客户端
* @param bucketName 上传的bucket名称
* @param objectName 上传后存储在bucket中的文件名
* @param filePath 上传的本地文件路径
*/
public void uploadFile(MinioClient minioClient, String bucketName, String objectName, String filePath) throws XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, IOException {
try {
// 若不存在bucket,则新建
boolean isExist = minioClient.bucketExists(bucketName);
if (!isExist) {
minioClient.makeBucket(bucketName);
}
// 使用 putObject 上传文件
minioClient.putObject(bucketName, objectName, filePath, null, null, null, null);
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
}
}
4.2.2 Загрузка файлов
/**
* 下载文件
*
* @param minioClient 操作客户端
* @param bucketName 上传的bucket名称
* @param objectName 上传后存储在bucket中的文件名
* @param downloadPath 下载文件保存路径
*/
public void downloadFile(MinioClient minioClient, String bucketName, String objectName, String downloadPath) throws XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, IOException {
File file = new File(downloadPath);
try (OutputStream out = new FileOutputStream(file)) {
InputStream inputStream = minioClient.getObject(bucketName, objectName);
byte[] tempbytes = new byte[1024];
int byteread = 0;
while ((byteread = inputStream.read(tempbytes)) != -1) {
out.write(tempbytes, 0, byteread);
}
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
}
}
4.2.3 Удаление файлов
Удалить файлы легко, используйтеremoveObject
Вот и все.
minioClient.removeObject(bucketName, objectName);
4.2.4 Список файлов
/**
* 罗列文件
* @param minioClient
* @param bucketName
*/
public void listFile(MinioClient minioClient, String bucketName) throws XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, IOException {
try {
Iterable<Result<Item>> results = minioClient.listObjects(bucketName);
Iterator<Result<Item>> iterator = results.iterator();
while (iterator.hasNext()) {
Item item = iterator.next().get();
System.out.println(item.objectName() + ", " + item.objectSize() + "B");
}
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
}
}
5 Резюме
Из-за необходимости независимого доступа к статическим ресурсам и разделения динамических и статических с помощью MinIO можно быстро и легко реализовать сервер статических ресурсов для доступа. В этой статье описывается загрузка, развертывание, запуск, эксплуатация и настройка MinIO, а в качестве примера для объяснения использования MinIO используется html для ссылки на файлы статических ресурсов, а также предлагается простое использование Java API. Я надеюсь, что все должны помочь.
Скачать
В этой статье nohup используется для запуска MinIO, но эта команда слишком длинная.Как правило, мы напишем сценарий для реализации запуска, завершения работы и запроса состояния.Поэтому я пишу сценарий в виде полного файла sh для использования всеми. Кроме того, тест MinIO Java API, в данном примере используется проект Spring Boot, который проводится в виде модульного тестирования.
файл сценария sh и проект Spring Boot вместе в моемпример минио на гитхабеСредний (сценарийminio-serviced.sh
В каталоге скриптов) вы можете скачать ссылку, если она вам нужна.
Как использовать скрипт:
- Измените параметры в сценарии sh в соответствии с реальной ситуацией.
- Изменить права на выполнение: chmod +x minio-serviced.sh
- Статус запуска/остановки/перезапуска/запуска по параметру: ./minio-serviced.sh start/stop/restart/status
использованная литература
-
Официальный сайт МинИО:
https://min.io/
-
Документация по разработке MinIO:
https://docs.min.io/
-
Перейти на практику на основе проектов с открытым исходным кодом. Решения для хранения объектов Mimio в избиении:
https://mp.weixin.qq.com/s/MzA4ODg0NDkzOA==&mid=2247487119&idx=1&sn=6e09abb32392e015911be3a1d7f066e5&source=41
-
Распределенные решения для хранения объектов, знакомые архитекторам:
https://juejin.cn/post/6844903844648845319
-
Используйте minio для создания высокопроизводительного объектного хранилища:
https://tonybai.com/2020/03/16/build-high-performance-object-storage-with-minio-part1-prototype
Прошлые статьи
- Получить несколько источников данных SpringBoot (3): параметризованный источник изменений
- Получить несколько источников данных SpringBoot (2): источники динамических данных
- Получить несколько источников данных SpringBoot (1): стратегии с несколькими источниками
- Знания, необходимые для разработки Java: динамический прокси
- Лучшие книги для чтения в 2019 году
- Springboot + apache для внешнего и внутреннего интерфейса, отдельное развертывание https
- Корпоративная практика вывода журнала Springboot + logback (ниже)
- Корпоративная практика вывода журнала Springboot + logback (включена)
Мой официальный аккаунт (поискMason技术记录
) для более технических записей: