Лабораторная работа #2

GitHub Classroom Workflow

Microservices

Формулировка

В рамках второй лабораторной работы по вариантам требуется реализовать систему, состоящую из нескольких взаимодействующих друг с другом сервисов.

Требования

  1. Каждый сервис имеет свое собственное хранилище, если оно ему нужно. Для учебных целей можно использовать один instance базы данных, но каждый сервис работает только со своей логической базой. Запросы между базами запрещены.
  2. Для межсервисного взаимодействия использовать HTTP (придерживаться RESTful). Допускается использовать и другие протоколы, например grpc, но это требуется согласовать с преподавателем.
  3. Выделить Gateway Service как единую точку входа и межсервисной коммуникации. Горизонтальные запросы между сервисами делать нельзя.
  4. На каждом сервисе сделать специальный endpoint GET /manage/health, отдающий 200 ОК, он будет использоваться для проверки доступности сервиса (в Github Actions в скрипте проверки готовности всех сервисов wait-script.sh.
    "$path"/wait-for.sh -t 120 "http://localhost:$port/manage/health" -- echo "Host localhost:$port is active"
  5. Код хранить на Github, для сборки использовать Github Actions.
  6. Gateway Service должен запускаться на порту 8080, остальные сервисы запускать на портах 8050, 8060, 8070.
  7. Каждый сервис должен быть завернут в docker.
  8. В docker-compose.yml прописать сборку и запуск docker контейнеров.
  9. В classroom.yml дописать шаги на сборку и прогон unit-тестов.
  10. Для автоматических прогонов тестов в файле autograding.json и classroom.yml заменить <variant> на ваш вариант.

Пояснения

  1. Для разработки можно использовать Postgres в docker, для этого нужно запустить docker compose up -d, поднимется контейнер с Postgres 13, и будут созданы соответствующие вашему варианту (описанные в файлах schema-$VARIANT) базы данных и пользователь program:test.
  2. Для создания базы нужно прописать в 20-create-schemas.sh свой вариант задания в
  3. Docker Compose позволяет выполнять сборку образа, для этого нужно прописать блок build.
  4. Горизонтальную коммуникацию между сервисами делать нельзя.
  5. Интеграционные тесты можно проверить локально, для этого нужно импортировать в Postman коллекцию <variant>/postman/collection.json) и <variant>/postman/environment.json.

Services

Предположим, у нас сервисы UserService, OrderService, WarehouseService и Gateway:

  • На Gateway от пользователя Alex приходит запрос Купить товар с productName: 'Lego Technic 42129.
  • Gateway -> UserService проверяем что пользователь существует и получаем userUid пользователя по login: Alex.
  • Gateway -> WarehouseService получаем itemUid товара по productName и резервируем его для заказа.
  • Gateway -> OrderService с userUid и itemUid и создаем заказ с orderUid.
  • Gateway -> WarehouseService с orderUid и переводим товар itemUid из статуса Зарезервировано в статус Заказан и прописываем ссылку на orderUid.

Прием задания

  1. При получении задания у вас создается fork этого репозитория для вашего пользователя.
  2. После того как все тесты успешно завершатся, в Github Classroom на Dashboard будет отмечено успешное выполнение тестов.

Варианты заданий

Варианты заданий берутся исходя из формулы: (номер в списке группы-1) % 4)+1.

  1. Flight Booking System
  2. Hotels Booking System
  3. Car Rental System
  4. Library System