Потребляйте сообщения из RabbitMQ и загружайте файлы epub в облачное хранилище MinIO.

В этом руководстве мы узнаем, как обрабатывать данные из брокера сообщений RabbitMQ и загружать файлы в облачное хранилище MinIO. Чтобы сделать его более увлекательным, мы собираемся изучить Epublib, библиотеку процессора epub для чтения и изменения электронных книг. Затем мы собираемся загрузить его в MinIO и сделать доступным для скачивания.

Представим себе следующий сценарий: вы щедрый писатель и опубликовали бесплатную электронную книгу. Вы хотите, чтобы ваши читатели могли скачать его в формате epub и поставить специальную подпись на титульной странице. Например, они могут сделать подарок своим друзьям и подписать титульную страницу чем-то вроде «Специально для XY».

С технической точки зрения: имя друга будет отправлено RabbitMQ в виде сообщения. Epublib создаст титульную страницу электронной книги на основе полученного имени. Наконец, мы загрузим новую электронную книгу в MinIO Cloud и предоставим ссылку для скачивания.

Давайте начнем!

Установите Message Broker

1. Настройте среду RabbitMQ.

Существуют различные методы установки, но в этом руководстве для простоты я использую образ Docker. Для получения дополнительной информации о том, как начать работу, обратитесь к документации.

  • Если у вас есть Docker на вашем компьютере, введите эту команду в Терминал, чтобы вытащить образ сообщества:
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
  • Чтобы не вводить команду каждый раз, создайте файл Docker yml с именем docker-compose.yml и введите следующую конфигурацию:

2. Протестируйте установку.

  • Теперь давайте запустим RabbitMQ, выполнив эту docker-compose команду:

docker-compose up -d

  • Если вы перейдете к localhost:15672 в своем браузере, вам будет предложено ввести имя пользователя и пароль. Войдите в систему с официальными учетными данными для тестирования - «гость / гость».

Вы должны увидеть такую ​​страницу:

Подготовьте Java-клиент

Я использую Java для подключения к RabbitMQ. Поддерживаются многие другие языки, поэтому, если вы хотите поэкспериментировать, посмотрите эту документацию на клиентские библиотеки.

1. Получите зависимости проекта.

  • Сначала создайте новый проект Gradle в вашей любимой IDE.
  • Поместите это содержимое в файл build.gradle:

Для проекта нам понадобятся только эти три библиотеки.

2. Создайте классы Java.

  • После успешной сборки создайте файл aMessageReceiver.java. Этот класс будет содержать логику нашего приложения.
  • Давайте создадим соединение RabbitMQ:

Обратите внимание, что мы хотим дождаться установления соединения. Мы выдадим исключение, если не сможем подключиться после всех попыток.

  • Тогда давайте подготовим нашу очередь сообщений. Он должен быть объявлен до того, как его можно будет использовать. Обратите внимание, что это был бы типичный способ объявления очереди, когда с ней хочет работать только один клиент: ему не нужно хорошо известное имя, никакой другой клиент не может его использовать (исключая), и он будет очищен автоматически. (автоудаление):

Значение prefetchCount определяет максимальное количество неподтвержденных доставок, разрешенных на этом канале. Как только число достигнет настроенного счетчика, RabbitMQ перестанет доставлять больше сообщений по каналу, если не будет подтверждено хотя бы одно из незавершенных сообщений. Чтобы узнать больше о благодарностях, прочтите документацию.

QUEUE_INPUT - это просто константа для имени нашей очереди:

private static final String QUEUE_INPUT = "my.simple.queue_input";
  • Теперь нам нужно создать канал для приема сообщений. Создайте startWork() метод, который будет отвечать за нашу логику выполнения.
public void startWork() throws IOException, TimeoutException, InterruptedException {

    Channel channel = createConnection().createChannel();

    prepareRabbitQueue(channel);

    System.out.println("Waiting for messages...");

}
  • Создайте класс AppRunner.java, который будет запускать приложение:
  • Проверьте, успешно ли установлено соединение, запустив класс AppRunner.java.

Вы должны иметь возможность войти в RabbitMQ из браузера, как мы это делали раньше.

  • Теперь давайте добавим к тому же методу код потребителя сообщения:
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
    System.out.println(" [x] Received '" + message + "'");

};
channel.basicConsume(QUEUE_INPUT, true, deliverCallback, consumerTag -> {
});
  • Повторно запустите код и перейдите в консоль брокера сообщений. Перейдите в «Очереди», введите что-нибудь в разделе PayLoad и нажмите «Опубликовать».

Вы должны увидеть полученное сообщение в консоли IDE.

Подготовьте клиент MiniIO

Мы собираемся использовать образ Docker для установки MinIO. Если вы хотите изучить другие способы установки, обратитесь к Руководству по установке.

1. Настройте среду MinIO.

  • Добавьте в файл docker-compose.yml следующие строки:

В этой конфигурации мы запускаем MinIO в распределенном режиме. По сути, он может выдерживать сбои нескольких узлов и в то же время обеспечивать полную защиту данных, поскольку диски распределены по нескольким узлам.

Для запуска в этом режиме нам понадобится четыре диска по требованиям. Как видите, мы назвали их minio1, minio2, minio3, minio4.

Чтобы запустить распределенный экземпляр MinIO, мы передаем расположение дисков в качестве параметров команде сервера minio. Все узлы должны иметь одинаковый ключ доступа и секретный ключ для подключения узлов. Обратите внимание, что мы создали учетные данные для входа MINIO_ACCESS_KEY: minio и MINIO_SECRET_KEY: minio123. Не стесняйтесь менять их по своему желанию.

2. Протестируйте установку.

  • Теперь выполните команду docker-compose, как раньше:

docker-compose up -d

  • Когда приложение запущено, войдите в http://localhost:9001/minio/login, используя учетные данные, предоставленные из файла docker yml.

Вы должны увидеть интерфейс браузера MinIO.

3. Подготовьте оригинальную электронную книгу.

Теперь, чтобы следовать нашему сценарию, мы должны загрузить исходную электронную книгу. Наша программа позже загрузит его и добавит новую титульную страницу.

Назовем его original-ebook.

  • Загрузите файл epub в корзину. Это предварительное условие для нашей программы.

4. Создайте обработчик сообщений.

Теперь, когда у нас есть оригинальная электронная книга в облачном хранилище, мы можем продолжить кодирование.

В этом руководстве я использую Java, поэтому давайте следовать Руководству по клиентской библиотеке Java. Если хотите, посмотрите документацию на другие поддерживаемые языки.

Мы уже извлекли зависимости MinIO из нашего build.gradle файла.

  • Создайте соединение MinIO в MessageReceiver.java:
  • Затем создайте код для загрузки файла в новом методе:

Обратите внимание, что имена bucket и object должны совпадать с теми, которые мы создали заранее.

  • Создайте другой метод загрузки файла:
  • Мы создадим еще одну корзину для модифицированных электронных книг. Я назвал его ebookcreator . Обратите внимание, что на этот раз программа автоматически создаст сегмент, если он еще не существует:
  • Чтобы сделать файл доступным для загрузки, мы должны создать URL:

Этот URL будет действителен в течение двух часов. Вы можете изменить дату истечения срока с помощью параметра expiry.

Обработка файла электронной книги

Поскольку мы уже загрузили необходимые зависимости для библиотеки процессора epub, нам просто нужно создать код для обработки электронной книги.

Создайте еще один класс с именем EBookHandler.java:

Мы получаем исходную книгу, имя читателя и имя новой электронной книги в качестве параметров из нашего MessageReceiver.java класса.

Для простоты мы собираемся программно создать очень простой signature.html файл, в котором будет отображаться имя читателя. Чтобы узнать больше о функциях Epublib, ознакомьтесь с официальными примерами программ.

Собери все вместе

Теперь нам просто нужно соединить наш EBookHandler.java с MessageReceiver.java, создав объект Book в startWork()method.

Полный метод должен выглядеть так:

Имя файла измененной книги будет однозначно сгенерировано с использованием UUID.randomUUID() метода Java.

Вот и все!

Приложение в действии

Давайте посмотрим, как работает наше приложение.

  • Запустите приложение.
  • Опубликуйте имя с помощью интерфейса RabbitMQ.
  • Войдите в интерфейс MinIO.

Вы должны увидеть нашу новую корзину под названием ebookcreator , содержащую новый файл epub:

  • Загрузите файл до истечения срока действия ссылки.
  • Откройте его с помощью программы просмотра epub или используйте автономную программу просмотра файлов Java epub, предоставленную официальной библиотекой. Его можно скачать отсюда.

Я собираюсь использовать автономную программу просмотра, чтобы открыть только что созданный файл epub. Титульная страница вашей электронной книги должна выглядеть примерно так:

Заключение

Я надеюсь, что вы узнали что-то новое из этого урока.

Спасибо за чтение и удачного кодирования!

использованная литература

  1. Https://github.com/kirshiyin89/rabbitmq_minio_demo
  2. Https://www.rabbitmq.com/java-client.html
  3. Https://www.rabbitmq.com/tutorials/tutorial-one-java.html
  4. Https://www.rabbitmq.com/confirms.html
  5. Https://docs.min.io/docs/
  6. Http://www.siegmann.nl/epublib
  7. Https://github.com/psiegman/epublib
  8. Https://www.adobe.com/solutions/ebook/digital-editions/sample-ebook-library.html