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

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

Унифицированная архитектура Asset Manager

На приведенной выше диаграмме показан высокоуровневый дизайн системы Unified Asset Management в проекте. Прежде всего следующие основные компоненты,

  • Уровень API микросервиса активов — основное возражение этого уровня, связанное с предоставлением всех операций CRUD. Этот уровень может извлечь выгоду из шаблона заводской архитектуры для размещения нескольких поставщиков хранилищ (самоуправляемых, AWS, Azure, GCP и т. д.). Кроме того, он может иметь функции предварительной обработки, такие как миниатюра запроса, сжатие и т. д.
  • База данных активов — для отслеживания сведений об активах, пантомимы/типа, хэша файла и других сведений.
  • Assets Webhook Manager. Не все варианты использования можно охватить в рамках общей службы. Некоторые расширения могут потребовать дополнительной обработки. В таком случае можно использовать вебхуки. Это очень похоже на использование функции Lambda в событии актива AWS S3. Мы можем использовать это, чтобы сохранить независимость проектного облака.
  • Хранилище активов — место, где файлы будут сохраняться и использоваться для извлечения.

Примечание. Если вы хотите создать дополнительный пользовательский контроль, я бы предложил использовать шлюз API для управления разрешениями на доступ.

Как это работает

На высоком уровне обслуживание простое. Когда когда-либо вызывается API создания ресурсов, он сохраняет документ на основе настроенного типа хранилища и сохраняет сведения о пути для уникального assetId. Этот assetId можно использовать в других микросервисах для справки и использовать для извлечения/обновления/удаления ресурса.

Хватит разговоров… давайте напишем код!

Как упоминалось ранее, мы используем Node JS для создания уровня API микросервиса активов. Мы не собираемся рассматривать веб-хуки в этом посте, но расскажем об этом когда-нибудь в будущем. Для базы данных мы используем Mongo DB, которую можно заменить на любую другую базу данных по вашему выбору.

Для начала при запуске экспресс-сервера мы также создаем необходимый менеджер активов. В приведенном выше примере мы используем локальное хранилище, но мы можем расширить его для других облачных провайдеров, используя переменные .env и дополнительный код.

Следующим шагом мы будем настраивать ваши маршруты. Обратите внимание, как assetId используется в API GET и DELETE для работы.

Поскольку здесь мы используем multer для обработки входящих файлов, мы используем приведенный выше код для разделения типов файлов и добавления их в определенную папку, чтобы сохранить ее в чистоте. Это может быть дополнительно улучшено в зависимости от потребности.

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

Наконец, мы определяем логику API для сохранения активов. Это довольно просто: у нас есть функция generateAssetId, которая создает уникальный assetId, а затем мы используем сведения о файле и сохраняем его в базе данных.

Наконец, мы предоставляем функции GET и DELETE для извлечения и удаления файла актива. Мы можем дополнительно изменить этот код, чтобы добавить параметры запроса для внесения изменений (предварительной обработки) в файл во время выборки. Например, у нас может быть что-то вроде /file/:assetId?thumbnail=true&type=rounded, которое будет возвращать меньший размер изображения, которое будет округлено. Что-то вроде image-transform поможет.

Что дальше?

В следующем посте я расскажу, как создавать и обрабатывать механизм запуска веб-перехватчиков, а также покажу, как докеризовать этот сервис для упрощения развертывания. А пока удачного кодирования!