В данном репозитории распологается примитивная реализация тестового стенда с концепцией reverse proxy
Есть endpoint http:localchost:2025/proc который при направлении туда get запроса выбирает по алгоритму roundrobin куда направить этот запрос (на какой /procces endpoint) и в зависимости от выбранного бекенда (1-5) приходит ответ о том, что бекенд под указанным номером обработал запрос.
Функциональные особенности:
- использован стандартный net/http
- балансировщик отправляет 500 код и пояснение об типе ошибки если бекенд ничего не ответил
- балансировщик может одновременно отвечать на несколько запросов на endpoint
- реализовано примитивное логгирование при помощи slog
- список бекендов получается из postgresql
- конфигурация не зависима от кода (конфиг файл для приложения в формате yaml расположен в /internal/configs)
- реализован "фильтр" частоты обращений от одного user (uid) при помощи специального алгоритма
- для каждого user поддерживается разный лимит запросов
- для хранения данных об лимитах юзера используется postgres
- модульная архитектура проекта с разделением на слои
- добавлен функционал проверки бекендов на работоспособность (в случае неработоспособности бекенды отключаются)
Содержит main файл микросервиса proy (содержит endpoint /proxy направляющий на один из бекендов) запускающий App метод расположенный в internal директории.
Содержит в себе 7 директорий
Метод загружает конфиги приложения из директории internal/configs
На текущий момент все конфиги содержатся в файле internal/configs/config.yaml
Подробная документация по тому что означает какой параметр находится в самом файле который используется для настроек по дефолту
В данной папке хранятся классы-обертки для json передаваемых данных по сети и хранящихся в базе данных user - тело запроса пользователя содержащие uuid (получаем класс по сети) bucket - корзина хранится в базе данных используем класс для хранения настроек по фильтрации пользовательских запросов
В данной папке расположены методы-обработчики, которые на уровне битов при помощи сервер класса обрабатывают endpoint запросы
В классе распложена вся бизнес логика приложения. Из-за того, что приложение инфраструктурного характера абстрации с которыми тут работа идет тоже сетевого уровня получаются
Класс service содержит общие методы (метод получение бекенда) которые нужны на уровне network чтобы endpoint обрабочики отвечали на запросы
Интерфейс filter - с его помощью реализован простейший фильтр по rpc нагрузки от одного пользователя при помощи алгоритма с одной корзиной https://linkmeup.gitbook.io/sdsm/15.-qos/7.-ogranichenie-skorosti/4-mekhanizmy-leaky-bucket-i-token-bucket/1-algoritm-token-bucket
Интерфейс balance - с его помощью реализован выбор бекендов при помощи алгоритма round robin (кольцевой массив)
Реализации интерфейсов filter и balance не строго привязаны к алгоритмам и легко меняются через метод создающий репозиторий при помощи добавления в конфигурационный файл нужных настроек Нужно лишь дописать требуемый код (интересная задачка для собеседования?)
Отдельно вынесены sql запросы в константы Методы принимают контест на случай "зависания" запроса При вызове методов создаем контест который дает 5 секунд на выполнение транзакции (при необходимости можно время добавить в файл конфигурации)
simplebackend - изолированный микросервис (содержит один endpoint /process - возвращающий код 200 и простой текст ответа)
Простейший enpoint который просто отправляет ответ на запрос - больше он ничего не делает
Файл create_db.sql - инициализация базы данных
Файл postgresql.conf - сюда пишем кофигурацию базы данных (дополнительное логирование и прочее)
Для запуска приложения необходимо запустить docker-compose.yml файл (с помощью расширений ide или консольной команды docker-compose up). В нем описан тестовый стенд состоящий из 5 бекендов (примитивные микросервисы отвечающие на запрос клиента), базы данных (postgresql), proxy сервиса.
Чтобы бекенд отвечал надо в теле запроса прописать поле uid_user json
Примеры значений поля uid_user расположены в config/create_db.sql
Для тестирования приложения в примере (скриншоты находятся в директории example) используется postman.
На скриншотах 1-3 показан примеры ответа прокси микросервиса Скриншоты 1-2 штатное перенаправление бекенда скриншот 3 аварийная блокировка при перегрузке запросов