Сервис предназначен для изготовления preview (создания изображения с новыми размерами на основе имеющегося изображения).
Сервис представляет собой web-сервер (прокси), загружающий изображения, масштабирующий/обрезающий их до нужного формата и возвращающий пользователю.
<---- микросервис ----><- размеры превью -><--------- URL исходного изображения --------------------------------->
В URL выше мы видим:
- http://cut-service.com/fill/300/200/ - endpoint нашего сервиса, в котором 300x200 - это размеры финального изображения.
- https://raw.githubusercontent.com/OtusGolang/final_project/master/examples/image-previewer/_gopher_original_1024x504.jpg - адрес исходного изображения; сервис должен скачать его, произвести resize, закэшировать и отдать клиенту.
Сервис должен получить URL исходного изображения, скачать его, изменить до необходимых размеров и вернуть как HTTP-ответ.
- Работаем только с HTTP.
- Ошибки удалённого сервиса или проксируем как есть, или логируем и отвечаем клиенту 502 Bad Gateway.
- Поддержка JPEG является минимальным и достаточным требованием.
Важно: необходимо проксировать все заголовки исходного HTTP запроса к целевому сервису (raw.githubusercontent.com в примере).
Сервис должен сохранить (кэшировать) полученное preview на локальном диске и при повторном запросе отдавать изображение с диска, без запроса к удаленному HTTP-серверу.
Поскольку размер места для кэширования ограничен, то для удаления редко используемых изображений необходимо использовать алгоритм "Least Recent Used".
Основной параметр конфигурации сервиса - разрешенный размер LRU-кэша.
Он может измеряться как количеством закэшированных изображений, так и суммой их байт (на выбор разработчика).
Развертывание микросервиса должно осуществляться командой make up
(внутри docker compose up
)
в директории с проектом.
Реализацию алгоритма LRU нужно покрыть unit-тестами.
Для интеграционного тестирования можно использовать контейнер с Nginx в качестве удаленного HTTP-сервера, раздающего вам заданный набор изображений.
Необходимо проверить работу сервера в разных сценариях:
- картинка найдена в кэше;
- удаленный сервер не существует;
- удаленный сервер существует, но изображение не найдено (404 Not Found);
- удаленный сервер существует, но изображение не изображение, а скажем, exe-файл;
- удаленный сервер вернул ошибку;
- удаленный сервер вернул изображение;
- изображение меньше, чем нужный размер; и пр.
- Наличие юнит-тестов на ключевые алгоритмы (core-логику) сервиса.
- Наличие валидных Dockerfile и Makefile/Taskfile для сервиса.
- Ветка master успешно проходит пайплайн в CI-CD системе
(на ваш вкус, GitHub Actions, Circle CI, Travis CI, Jenkins, GitLab CI и пр.).
Пайплайн должен в себе содержать:
- запуск последней версии
golangci-lint
на весь проект с конфигом, представленным в данном репозитории; - запуск юнит тестов командой вида
go test -race -count 100
; - сборку бинаря сервиса для версии Go не ниже 1.21.
- запуск последней версии
При невыполнении хотя бы одного из требований выше - незачёт, несмотря на, например, полностью написанный код сервиса.