Golang: Image Generator - server

9 165
15.9
LoftBlog384 тыс
Опубликовано 20 октября 2020, 7:40
Данное видео - первое из трёх, где мы создаём "Генератор Изображений" на Golang.
Мы с вами создадим сервис в виде сервера, который будет генерить картинки - плейсхолдеры.
И отдавать эти картинки - как ответ на запрос к нашему серверу.

Где это может пригодится?
эти картинки можно использовать при вёрстке сайта или для уже работающего сайта, как картинку заглушку.
Часто при вёрстке макета сайта, нам нужна картинка по ссылке определённого размера.
генерить favicon.ico на лету. Это в том случае, если мы по тем или иным причинам не хотим или не можем загрузить favicon.ico на сервер. А у нас есть только один бинарник приложения, с бизнес логикой в нём. И нам нужно добавить в него ещё и генерацию favicon. Как вариант. Этот вариант, конечно не без минусов.
генерить pixel трекер на сайт. Опять же это один бинарник. Закинул его на сервер. И он будет отдавать и картинку и собирать метрики.
если расширить наш функционал - мы сможем принимать картинку из запроса. И нарезать её по требуемым параметрам. То есть онлайн нарезка картинки. А картинку присылать как файл или как ссылку на картинку на внешнем ресурсе.

Данный функционал мы создадим в три этапа (три видео):
- на первом - мы с вами создадим сервер с базовой структурой,
- на втором - мы добавим возможность генерить картинку фиксированного размера и отдавать её, как ответ сервера,
- на третьем - мы дополним наш проект возможностью задавать: размеры и цвет изображения, а также: текст, его цвет и шрифт - в запросе к серверу.

Под базовой структурой сервера я подразумеваю наличие довольно устоявшегося подхода организации серверного приложения.
Некоторое описание данного подхода можно найти в репозитории: github.com/golang-standards/pr...
Здесь описан layout нашего сервера:
"cmd" - как входная точка нашего приложения. Здесь располагаются наши пакеты "main".
"internal" - каталог с внутренними пакетами. Предполагается, что эти пакеты будут использоваться только в нашем проекте. И имеют связь, желательно конечно, не строгую, а через интерфейсы или логику - с нашим приложением. Это не просто отдельные функции, которые мы вынесли в отдельный пакет, но это сервисы (желательно), имеющие в зависимостях только интерфейсы, как входные параметры.
"pkg" - каталог с пакетами, которые максимально отвязаны от кодовой базы нашего проекта. Это пакеты, которые можно импортировать в другие проекты. Но которые пока ещё не мигрировали в отдельный репозитарий, по тем или иным причинам.

Также в своих проектах я обязательно добавляю Makefile и README.md. Эти файлы сильно упрощает понимание проекта при первом знакомстве: какие команды приложение принимает и какой функционал предполагается. Makefile позволяет не запоминать длинные и параметризованные команды, а запускать короткие замены им, что-то вроде "меню" по работе с проектом.

Makefile это набор команд, которые понимает и корректно обрабатывает приложение. При этом команды могут быть как простыми, так и сложными, когда в аргументах есть много параметров (по умолчанию или обязательных). А имена команд показывают, чего ожидать от данной команды:
запуск приложения
сборка проекта (билд проекта часто происходит под одну или несколько ОС и с требуемыми флагами пакетов или в целом приложения)
тестирование пакетов приложения или вендорных зависимостей
очистка сборки (удалить предыдущую сборку)
деплой проекта.
Кроме команд работы с нашим приложением в Makefile могут быть добавлены и команды по подготовке окружения, выдачи прав на каталоги и/или файлы, старта или рестарта приложения. В Makefile вы можете добавить получение некой "справки" по командам - написать короткий bash скрипт, который будет выводить все комментарии к командам Makefile.
Кроме того, Makefile может помочь Вам при работе с фронтовой частью проекта - собрать, протестировать и прочее.

А в README.md я добавляю название проекта и его назначение. Примеры и описание его запуска и характеристики, на которые он рассчитан, то есть чего ожидать от этого проекта пользователю и/или программисту, которые будет его внедрять и/или поддерживать. Здесь же обязательно следует добавить примеры запуска, остановки и рестарта проложения. Также я пишу (но редко) описание логирования - куда пишутся логи и в каком формате.

И конечно мы инициализируем golang модуль нашего приложения - сделаем "go mod init". Это пригодится нам для публикации нашего приложения и главное для "правильного", современного управления зависимостями нашего проекта. Гибко, прозрачно и без боли обновлять или удалять - требуемые пакеты.

Второй урок: youtu.be/LyyK-tGhSuI

#golang #image #generator #server

______________________________

ГДЕ С НАМИ ПООБЩАТЬСЯ
⚡️Школа онлайн-образования: loftschool.com
⚡️Telegram Loftblog: t-do.ru/loftblog
⚡️Telegram IT-обучение: t-do.ru/it_loft
⚡️Группа вконтакте: vk.com/loftblog
жизньигрыфильмывесельеавтотехномузыкаспортедаденьгистройкаохотаогородзнанияздоровьекреативдетское