В рамках второй лабораторной работы по вариантам требуется реализовать систему, состоящую из нескольких взаимодействующих друг с другом сервисов.
- Каждый сервис имеет свое собственное хранилище, если оно ему нужно. Для учебных целей можно использовать один instance базы данных, но каждый сервис работает только со своей логической базой. Запросы между базами запрещены.
- Для межсервисного взаимодействия использовать HTTP (придерживаться RESTful). Допускается использовать и другие протоколы, например grpc, но это требуется согласовать с преподавателем.
- Выделить Gateway Service как единую точку входа и межсервисной коммуникации. Горизонтальные запросы между сервисами делать нельзя.
- На каждом сервисе сделать специальный 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"
- Код хранить на Github, для сборки использовать Github Actions.
- Gateway Service должен запускаться на порту 8080, остальные сервисы запускать на портах 8050, 8060, 8070.
- Каждый сервис должен быть завернут в docker.
- В docker-compose.yml прописать сборку и запуск docker контейнеров.
- В classroom.yml дописать шаги на сборку и прогон unit-тестов.
- Для автоматических прогонов тестов в файле autograding.json
и classroom.yml заменить
<variant>
на ваш вариант.
- Для разработки можно использовать Postgres в docker, для этого нужно запустить docker compose up -d, поднимется
контейнер с Postgres 13, и будут созданы соответствующие вашему варианту (описанные в
файлах schema-$VARIANT) базы данных и пользователь
program
:test
. - Для создания базы нужно прописать в 20-create-schemas.sh свой вариант задания в
- Docker Compose позволяет выполнять сборку образа, для этого нужно прописать
блок
build
. - Горизонтальную коммуникацию между сервисами делать нельзя.
- Интеграционные тесты можно проверить локально, для этого нужно импортировать в Postman
коллекцию
<variant>/postman/collection.json
) и<variant>/postman/environment.json
.
Предположим, у нас сервисы 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
.
- При получении задания у вас создается fork этого репозитория для вашего пользователя.
- После того как все тесты успешно завершатся, в Github Classroom на Dashboard будет отмечено успешное выполнение тестов.
Варианты заданий берутся исходя из формулы: (номер в списке группы-1) % 4)+1.