Практические задания
по всем модулям

Практические задания
по всем модулям
01.
Основы Go
Описание разрабатываемого сервиса. Auth
Сервис Auth отвечает за проверку прав доступа и хранит информацию о зарегистрированных в системе пользователях.
Пользователям по http доступны два метода сервиса:
  • login
  • verify
Полное описание API вы найдёте тут.
Для простоты реализации информация о пользователях хранится в настройках сервиса и обновляется только при перезапуске.
Домашнее задание
  • Реализуйте сервис, предоставляющий пользователям http API с двумя методами: login и verify
  • Каждый из методов должен возвращать в теле ответа имя функции, которая его реализует. Логику сервиса будет полностью реализована в следующих проектах
  • При получении сигнала SIGTERM или Interrupt сервис должен прекратить принимать входящие запросы и корректно ответить на запросы, принятые к обработке
02.
Стандартные библиотеки и практики Go
В этом домашнем задании мы реализуем основную бизнес-логику сервиса Auth.
Добавьте возможность задать список пар login / password в настройках сервиса:
  • настройки сервиса должны задаваться в файле с расширением yaml. Для чтения настроек можно воспользоваться популярной библиотекой viper
  • секреты(пароль и соль) должны задаваться через переменные окружения
  • пароли пользователей не должны хранится в настройках в открытом виде. Используйте для шифрования паролей пакет pbkdf2
  • при старте сервиса пары login / password должны быть прочитаны и сохранены в in-memory хранилище на основе стандартного типа map
Реализуйте процесс авторизации пользователя:
  • метод POST endpoint'а login при использовании Basic authorization должен возвращать cookie access_token с jwt-token'ом, действительным в течение 1 минуты
  • метод POST endpoint'а login при использовании Basic authorization должен возвращать cookie refresh_token с jwt-token'ом, действительным в течение 60 минут
  • метод POST endpoint'а verify должен возвращать код ответа 200 в случае если access token действителен, а также информацию о пользователе: почту. Если у access-token'a истёк срок действия, то выполняется проверка refresh-токена. Если refresh-token действителен, то возвращается код ответа 200 и токены обновляются. Если оба токена недействительны, то возвращается ответ 403
03.
Основы DevOps
В этом домашнем задании настроим CI/CD для сервиса Auth и задеплоим сервис в Kubernetes.
  • напишите docker-файл для сборки контейнера
  • напишите docker-compose для запуска приложения локально
  • настройте CI/CD в проекте сервиса auth
  • задеплойте приложение в кластер Kubernetes
04.
Основы мониторинга и сбора метрик
В этом домашнем задании добавим инструменты для мониторинга и расследования инцедентов сервиса Auth в кластере.
Подключите структурированный логгер к проекту:
  • в качестве логгера используйте библиотеку uber/zap.
  • минимальный уровень логгирования должен указываться в настройках сервиса
  • к логгеру должен быть подключён Sentry
Добавьте инструменты мониторинга в http-сервер:
  • добавить логгирующую middleware. Middleware должна логгировать тело и хедеры всех входящих запросов с уровнем DEBUG
  • добавьте recovery middleware
  • добавьте middlware для трейсинга запроса. Каждый ответ сервиса должен содержать header trace-id
Добавьте отправку метрик http-сервера в prometheus / grafana
Дополнительное задание
Реализуйте RBAC - ролевой доступ.
Кроме почты для пользователя назначается одна из ролей из предопределенного списка. В нашем проекте достаточно viewer и administrator.
При проверки доступа кроме почты необходимо возвращать список ролей, доступных пользователю.
Дополнительные материалы
Sentry
В любом приложении случаются ошибки. Для их отслеживания есть несколько стратегий:
  • контроль метрик и настройка уведомлений. Например, количество ошибочных запросов
  • мониторинг логов приложения и контроль кол-ва ошибок
Sentry предоставляет удобный интерфейс для отслеживания ошибок в логах.
Sentry позволяет:
  • настраивать какие ошибки требуют расследование, а какие нет
  • назначать ответственного за расследование проблемы
  • анализировать как часто воспроизводится проблема
Для интеграции логгера uber\zap и Sentry удобно использовать пакет zapsentry.
05.
Архитектура и шаблоны проектирования
В этом домашнем задании разработаем шаблон микросервиса для реализации оставшихся сервисов Tasks и Mailsender.
Разработайте шаблон микросервиса:
  • создайте структуру каталогов согласно гексоганальной архитектуре
  • сервис должен корректно завершать свою работу при получении сигналов SIGTERM и Interrupt
  • настройте логгер в приложении
  • добавьте endpoint для ready prob
Настройте чтение конфигурации из переменных окружения:
  • уровень логгирования
  • адрес сервера jaeger
  • адресе сервера Sentry
  • адрес сервера для отправки метрик
Напишете docker файл для сборки приложения и docker-compose файл для локального запуска
создайте Makefile и добавьте в него следующие команды:
  • запуск линтера
  • запуск форматтера
  • запуск генерации swagger
06.
Runtime. Работа с памятью
В этом домашнем задании мы начнём работу над сервисом Tasks и напишем основную бизнес-логику сервиса.
Инициализируете репозиторий сервиса Tasks, используя шаблон сервиса, написанный в предыдущей домашней работе
разработайте бизнес логику сервиса Tasks (в слое сервисов):
  • методы для создания / прекращения согласования задачи. Задачи должны хранится в оперативной памяти
  • методы для согласования и отклонения задачи согласующими
  • отправка писем выполняется выводом письма в лог
  • сервис должен предоставлять список задач, которые были созданы текущим пользователем
07.
Документация и тестирование
В этом домашнем задании мы подготовим документацию для наших сервисов Auth и Tasks.
  • Добавьте http сервис для вызова методов сервиса
  1. Метод POST для создания задач, возвращающий id задачи
  2. Метод GET для получения задачи по id
  3. Метод POST для согласования задачи согласующим
  4. Метод POST для отклонения задачи согласующим
  5. Метод GET для получения списка задач, созданным пользователем
  • Добавьте описание методов API и сгенерируйте описание API swagger с помощью пакета go-swagger
  • Добавьте в makefile команду для генерации swagger'a
  • Сгенерируйте cli клиенты для вашего API с помощью go-swagger
  • Добавьте в makefile команду для генерации cli-клиента
  • Добавьте middleware для проверки авторизации на endpoint'ах по созданию / отмене задач. В middleware должен осуществлять вызов сервиса auth. Реализуйте вызов вызов сервиса auth в адаптере. Позднее мы заменим http-адаптер на gRPC адаптер.
08.
Базы данных: Mongo
В этом домашнем задании разработаем тесты для сервисов tasks и auth.
Разработайте юнит-тесты на бизнес-логику сервиса tasks:
  • изменение статуса задачи при успешном / не успешном согласовании
Разработайте интеграционные тесты для сервиса tasks:
  • создание задачи
  • отмена задачи
Разработайте интеграционные тесты для сервиса auth:
  • успешная авторизация
  • неуспешная авторизация
  • успешная верификация
  • неуспешная верификация
09.
Базы данных: PostgreSQL
В этом домашнем задании реализуем персистентное хранение для задач в сервисе tasks.
  • реализуйте адаптер для хранения задач в mongoDB
  • реализуйте паттерн outbox при отправке писем
  • напишите интеграционные тесты с использованием библиотеки testcontainers для сервиса tasks
09.1
Домашнее задание
В этом домашнем задание мы изменим протокол взаимодействия сервисов auth и tasks с http на gRPC.
  • опишите интерфейс сервиса auth в спецификации gRPC
  • сгенерируйте и напишите имплементацию gRPC API в сервисе auth. Не забудьте подключить метрики и трейсинг Jaeger
  • воспользуйтесь сгенерированным gRPC клиентом в сервисе tasks для проверки авторизации
10.
Очереди: Kafka
В этом домашнем задании мы добавим персистентное хранение пользователей в сервис auth.
  • реализуйте адаптер для хранения пользователей на основе PostgreSQL
  • реализуйте миграции для инициализации базы данных с использованием библиотеки go-migrate. Код миграций должен предусматривать выполнение от пользователей, отличного от пользователя, под которым будет вестись работу с БД.
  • реализуйте миграции для создания предопределённых пользователей с использованием библиотеки go-migrate
11.
Concurrency в Go
В домашнем задании мы реализуем сервис notifier, который будет принимать сообщение из топика kafka.
Для проверки работы сервиса научимся отправлять сообщение в топик с помощью консольного клиента.
  • реализуйте "болванку" сервиса mailsender по шаблону, сделанному ранее
  • реализуйте адаптер-заглушку для почтового сервиса. Адаптер с вероятности в 20% должен отказывать в обслуживании
  • сервис notifier должен читать сообщения из топика kafka и пытаться отправить их для отправки в почтовый сервер
11.1
Домашнее задание
В этом домашнем задании мы реализуем паттерны rate limiter для защиты от DDOS сервиса tasks.
У сервиса tasks есть ручки для создания задач. Давайте представим что для задач можно прикреплять большие файлы. Файлы хранятся по простому в persistent volume в Kubernetes. Но у нашего кластера проблемы со скоростью доступа к жёстким дискам. Поэтому нам нужно ограничить одновременное кол-во запросов на создание задач на уровне 100 запросов / с.
  • реализуйте rate limiter, который будет гарантировать выполнение не более 100 запрос / с на создание задач. Запрещено использовать сторонние библиотеки для реализации rate limiter.