Содержание
Работая над новой программой, нужно было реализовать несколько довольно простых вещей: проверка последней версии и поддержание постоянных ссылок.
Можно было бы обойтись набором из nginx и других уже написанных программ, но я нашел более изящное решение — написать микросервисы. И постараться их более менее унифицировать.
12 факторов
Мне очень нравится эта концепция. Если приложение написано с учетом 12 факторов, его легко запускать и в локальном Docker, и в Kubernetes-кластере.
Вот что в первую очередь нужно держать в голове:
- настройка через переменные окружения
- не хранить в приложении никакого состояния (чтобы пользователь не заметил перезапуск)
- писать логи в стандартный вывод
Микросервис статического ответа
— Как проверить последняя ли у приложения версия?
— Запросить из некоторого источника какая версия последняя и сравнить с текущей.
Соответственно нужен сервер, который бы возвращал какая версия текущая. А чтобы немного обобщить задачу — был написан веб-сервис, который бы на все GET запросы отвечал бы статической строкой. А строку задаем из переменной окружения.
https://github.com/delfer/go-static-responser
Микросервис написан на Go потому, что:
- на нем любой программист может очень быстро что-то разработать
- исполняемый код достаточно компактный по сравнению с другими языками того же уровня абстракции
- высокая скорость работы, иногда даже если сравнивать с Си
Основных параметра два — порт, который слушать, и строка, которую возвращать. Порт можно не указывать — по умолчанию 8080. Микросервис запаковывается в Docker-образ.
https://hub.docker.com/r/delfer/go-static-responser/
Даже в микрообраз) Так как вместе sh, grep, ls, less, vi и другими busybox утилитами, он занимает 4.5Мб:
(иногда тут может быть написано unknown, так как сервис microbadger.com еще не успел посчитать размер после последней сборки)
Микросервис статических перенаправлений
Это, по своей сути, форк предыдущего микросервиса, только в нем вместо задания ответа нужно задать набор перенаправлений. Конечно, можно было обе функции объединить в один мультитул, но тогда это был бы уже не микросервис)
https://github.com/delfer/go-static-redirector
Нужно было привязать домен, поддомены и несколько ссылок так, чтобы сегодня они перенаправляли людей на GitHub, а в будущем, возможно, уже отдавать полноценные страницы по тем же адресам.
https://hub.docker.com/r/delfer/go-static-redirector/
Docker-образ такой-же «микро».
При чем тут Yandex ClickHouse?
Действительно, при чем?) При том что описанные выше микросервисы могут писать посещения в ClickHouse, хотя функция эта опциональная. Конечно, можно было бы парсить логи nginx, который стоит перед микросервисами, но это не выглядит как самый оптимальный путь. А так, при малой интенсивности посещения записываются по одному, при повышении нагрузки начинают писаться пачками. Размер буфера для формирования пачек также задается переменной окружения и по умолчанию равен 100,000.
А уже имея данные в ClickHouse, очень удобно их анализировать, формировать статистику.
0 Комментарии。