Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Что это такое?

В данном репозитории распологается примитивная реализация тестового стенда с концепцией 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
  • модульная архитектура проекта с разделением на слои
  • добавлен функционал проверки бекендов на работоспособность (в случае неработоспособности бекенды отключаются)

Структура проекта

Директория cmd

Содержит main файл микросервиса proy (содержит endpoint /proxy направляющий на один из бекендов) запускающий App метод расположенный в internal директории.

Директория internal

Содержит в себе 7 директорий

app - расположен метод Run запуска микросервиса proxy

Метод загружает конфиги приложения из директории internal/configs

configs - конфигурационные дефолтные файлы проекта

На текущий момент все конфиги содержатся в файле internal/configs/config.yaml

Подробная документация по тому что означает какой параметр находится в самом файле который используется для настроек по дефолту

model - json сериализация передаваемых данных по сети

В данной папке хранятся классы-обертки для json передаваемых данных по сети и хранящихся в базе данных user - тело запроса пользователя содержащие uuid (получаем класс по сети) bucket - корзина хранится в базе данных используем класс для хранения настроек по фильтрации пользовательских запросов

reverse_proxy - network слой микросервиса proxy

В данной папке расположены методы-обработчики, которые на уровне битов при помощи сервер класса обрабатывают endpoint запросы

service - сервисный уровень микросервиса proxy

В классе распложена вся бизнес логика приложения. Из-за того, что приложение инфраструктурного характера абстрации с которыми тут работа идет тоже сетевого уровня получаются

Класс 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 не строго привязаны к алгоритмам и легко меняются через метод создающий репозиторий при помощи добавления в конфигурационный файл нужных настроек Нужно лишь дописать требуемый код (интересная задачка для собеседования?)

repository - уровень базы данных микросервиса proxy

Отдельно вынесены sql запросы в константы Методы принимают контест на случай "зависания" запроса При вызове методов создаем контест который дает 5 секунд на выполнение транзакции (при необходимости можно время добавить в файл конфигурации)

simplebackend - изолированный микросервис (содержит один endpoint /process - возвращающий код 200 и простой текст ответа)

Простейший enpoint который просто отправляет ответ на запрос - больше он ничего не делает

cofing - директория с общей конфигурацией проекта

Файл 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 аварийная блокировка при перегрузке запросов

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages