image-previewer

module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 14, 2020 License: Apache-2.0

README

pipeline status coverage report

Запуск / остановка микросервиса через Docker-compose

make up / make down

Запуск интеграционных тестов микросервиса через Docker-compose

make test

ТЗ на сервис "Превьювер изображений"

Общее описание

Сервис предназначен для изготовления preview (создания изображения с новыми размерами на основе имеющегося изображения).

Пример превьюшек в папке examples (./examples)

Архитектура

Сервис представляет собой web-сервер (прокси), загружающий изображения, масштабирующий/обрезающий их до нужного формата и возвращающий пользователю.

Основной обработчик

https://cut-service.com/fill/300/200/www.audubon.org/sites/default/files/a1_1902_16_barred-owl_sandra_rothenberg_kk.jpg

<---- микросервис ----><- размеры превью -><--------- URL исходного изображения --------------------------------->

В URL выше мы видим:

Сервис должен получить URL исходного изображения, скачать его, изменить до необходимых размеров и вернуть как HTTP-ответ.

Важно: необходимо проксировать все заголовки исходного HTTP запроса к целевому сервису (www.audubon.org в примере).

Сервис должен сохранить (кэшировать) полученное preview на локальном диске и при повторном запросе отдавать изображение с диска, без запроса к удаленному HTTP-серверу.

Поскольку размер места для кэширования ограничен, то для удаления редко используемых изображений необходимо использовать алгоритм "Least Recent Used".

Конфигурация

Основной параметр конфигурации сервиса - разрешенный размер LRU-кэша.

Развертывание

Развертывание микросервиса должно осуществляться командой make run (внутри docker compose up) в директории с проектом.

Тестирование

Реализацию алгоритма LRU нужно покрыть unit-тестами.

Для интеграционного тестирования можно использовать контейнер с Nginx в качестве удаленного HTTP-сервера, раздающего вам заданный набор изображений.

Необходимо проверить работу сервера в разных сценариях:

  • картинка найдена в кэше;
  • удаленный сервер не существует;
  • удаленный сервер существует, но изображение не найдено (404 Not Found);
  • удаленный сервер существует, но изображение не изображение, а скажем, exe-файл;
  • удаленный сервер вернул ошибку;
  • удаленный сервер вернул изображение;
  • изображение меньше, чем нужный размер; и пр.

Разбалловка

Максимум - 10 баллов (при условии выполнения обязательных требований):

  • Реализован HTTP-сервер, проксирующий запросы к удаленному серверу - 1 балл.
  • Реализована нарезка изображений - 1 балл.
  • Кэширование нарезанных изображений на диске - 1 балл.
  • Ограничение кэша по месту (LRU кэш) - 1 балл.
  • Прокси сервер правильно передает заголовки запроса и ответа - 1 балл.
  • Сервис не протекает по памяти - 1 балл.
  • Написаны интеграционные тесты - 2 балла.
  • Тесты адекватны и полностью покрывают фукнционал - 1 балл.
  • Проект возможно собрать чере make build, запустить через make run и протестировать через make test - 1 балл.

Дополнительные требования

  • Наличие юнит-тестов на ключевые алгоритмы (ядро) сервиса.
  • Докеризация сервиса:
    • наличие валидного Dockerfile для сервиса;
    • сервис и необходимое ему окружение запускаются без ошибок через make run (внутри docker compose up) в корне проекта, при этом все нужные для работы с сервисом порты доступны с хоста.
  • Ветка master успешно проходит пайплайн в CI-CD системе (на ваш вкус, Circle CI, Travis CI, Jenkins, GitLab CI и пр.). Пайплайн должен в себе содержать:
    • запуск go fmt и проверку, что команда ничего не возвращает (все файлы уже отформатированы);
    • запуск go vet;
    • запуск последней версии golangci-lint на весь проект с флагом --enable-all;
    • запуск go test и go test -race;
    • сборку бинаря сервиса для версии Go не ниже 1.12.

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

Использование сторонних библиотек

Допускается, но:

  • вы должны иметь представление о том, что происходит внутри.
  • точно ли подходит данная библиотека для решения вашей задачи?
  • не станет ли библиотека узким местом сервиса?
  • не полезнее ли написать функционал, которые вы хотите получить от библиотеки, самому?

Для упрощения проверки вашего репозитория, рекомендуем использовать значки GitHub (GitHub badges), а также Go Report Card.

Directories

Path Synopsis
cmd
internal
caches
Package caches implements cacher interface.
Package caches implements cacher interface.
caches/lru
Package lru implements LRU cache algorithm .
Package lru implements LRU cache algorithm .
caches/nolimit
Package nolimit implements cache with simple nolimit algorithm.
Package nolimit implements cache with simple nolimit algorithm.
configs
Package configs implements config interface.
Package configs implements config interface.
domain/entities
Package entities implements various options models.
Package entities implements various options models.
domain/errors
Package errors implements base preview errors.
Package errors implements base preview errors.
domain/interfaces/cache
Package cache implements cache interface.
Package cache implements cache interface.
domain/interfaces/encode
Package encode implements encode interface.
Package encode implements encode interface.
domain/interfaces/preview
Package preview describes domain image interface.
Package preview describes domain image interface.
domain/interfaces/storage
Package storage implements storage interface.
Package storage implements storage interface.
domain/linkedlist
Package linkedlist implements a doubly linked list.
Package linkedlist implements a doubly linked list.
domain/preview
Package preview implements business logic.
Package preview implements business logic.
encoders
Package encoders implements encoders interface.
Package encoders implements encoders interface.
encoders/hash
Package hash implements encoding hash interface.
Package hash implements encoding hash interface.
helpers
Package helpers implements helpers funcs.
Package helpers implements helpers funcs.
http
Package http implements http server for previewer.
Package http implements http server for previewer.
loggers
Package loggers implements logger interface.
Package loggers implements logger interface.
loggers/logrus
Package logrus implements logrus logger.
Package logrus implements logrus logger.
loggers/logstd
Package logstd implements std log logger.
Package logstd implements std log logger.
models
Package models implements models.
Package models implements models.
previewers
Package previewers implements image interface.
Package previewers implements image interface.
previewers/nfnt_crop
Package nfntcrop implements nfnt image resizer.
Package nfntcrop implements nfnt image resizer.
previewers/xdraw
Package xdraw implements x/draw image resizer.
Package xdraw implements x/draw image resizer.
storages
Package storages implements storage interface.
Package storages implements storage interface.
storages/disk
Package disk implements storage on disk.
Package disk implements storage on disk.
storages/inmemory
Package inmemory implements storage in memory map.
Package inmemory implements storage in memory map.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL