Предметная область - программы спортивных тренировок.
- Функционал управления программами тренировок;
- Функционал управления пользователями.
- Развертывание с помощью Kubernetes;
- Мониторинг через Grafana, Prometheus, дашборды настроены автоматически "из коробки" благодаря описанию в манифестах K8S;
- Аутентификация по JWT.
- Gateway - точка входа. Проксирует запросы к внутренним сервисам, выдаёт и проверяет JWT;
- Сервис программ тренировок - управляет программами тренировок. Предоставляет REST API, GraphQL API;
- Сервис пользователей - управляет пользователями приложения.
- Язык: Go;
- API: HTTP, GraphQL, Swagger/OpenAPI (через
swaggo); - Аутентификация: JWT;
- Постоянное хранилище данных: MongoDB;
- Кэш: Redis;
- Брокер сообщений: Apache Kafka;
- Мониторинг: Prometheus, Grafana;
- Контейнеризация и оркестрация: Kubernetes, Minikube.
GraphQL предоставляет API сервиса программ тренировок в дополнение к HTTP. Реализует запросы:
allPrograms(query);program(query);programsCount(query);programFilter(query);updateProgram(мутация);addProgram(мутация);deleteProgram(мутация);deleteAllPrograms(мутация).
Запросы можно отправлять через GraphQL Playground на порту 8010.
JWT применяется в Gateway для аутентификации запросов. Роут /login проверяет существование пользователя через сервис пользователей и формирует JWT. Gateway проверяет токен перед проксированием на другие сервисы;
Основное хранилище данных. Сервисы работают с разными коллекциями.
Используется сервисом программ тренировок в качестве кэша программ, запрошенных по идентификатору. Используется стратегия кэширования Cache Aside.
Обеспечивает асинхронное взаимодействие сервисов при подтверждении программы пользователем. Сервис программ тренировок публикует сообщение в топик request, передавая идентификатор программы и пользователя. Сервис пользователей читает этот топик, проверяет пользователя в MongoDB и публикует результат в топик post. Сервис программ тренировок читает ответ и сохраняет статус подтверждения программы. Таким образом асинхронное подтверждение программ не блокирует http запросы клиента.
Система развертывается в виде набора сущностей k8s. Манифесты указаны ./manifests
- Запустить minikube:
minikube start; - Применить манифесты:
kubectl apply -f .\manifests\ --recursive; - Убедиться, что все поды готовы к использованию:
kubectl get pods; - Хотя здесь настроен ingress, из-за особенностей minikube может понадобиться пробросить наружу порты:
kubectl port-forward service/gateway 8083:8083; - Перейти на
http://localhost:8083/swagger/index.html; - Чтобы просмотреть дашборды нужно пробросить порты до Grafana
kubectl port-forward service/grafana 3000:3000; - Перейти на
http://localhost:3000. Логин и пароль для входа -admin.
Поды готового приложения
Swagger документация
Пример выполненного HTTP-запроса
Пример выполненного GraphQL-запроса для получения только нужных клиенту полей
Автоматические настроенные через манифесты K8S дашборды
Дашборд метрик сервиса пользователей
Дашборд метрик Gateway сервиса
Дашборд метрик сервиса программ тренировок