{"id":20645022,"url":"https://github.com/romanow/scc-orders","last_synced_at":"2026-04-21T19:33:33.713Z","repository":{"id":143407306,"uuid":"223916230","full_name":"Romanow/scc-orders","owner":"Romanow","description":"Order Service","archived":false,"fork":false,"pushed_at":"2022-08-15T19:48:35.000Z","size":104,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-09T15:54:31.833Z","etag":null,"topics":["kotlin","spring-boot","spring-cloud-contract"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Romanow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-25T09:59:20.000Z","updated_at":"2022-08-15T19:37:43.000Z","dependencies_parsed_at":"2023-09-19T10:31:16.500Z","dependency_job_id":null,"html_url":"https://github.com/Romanow/scc-orders","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Romanow/scc-orders","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fscc-orders","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fscc-orders/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fscc-orders/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fscc-orders/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Romanow","download_url":"https://codeload.github.com/Romanow/scc-orders/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fscc-orders/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32106671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kotlin","spring-boot","spring-cloud-contract"],"created_at":"2024-11-16T16:18:26.420Z","updated_at":"2026-04-21T19:33:33.696Z","avatar_url":"https://github.com/Romanow.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Order Service\n\n```shell\n# run once, it create DB services with schemas\ndocker compose up -d postgres\n# build and run tests\n./gradlew clean build\n./gradlew bootRun\n# open in browser http://localhost:8080/swagger-ui.html\n```\n\n# Consumer Driven Development\n\n1. Проблемы интеграционного тестирования.\u003cbr\u003e\n   У нас есть много микросервисов и при изменении поведения в одном мы хотим гарантировать, что не нарушается\n   функциональность других. Два подхода:\n    1. Развертывание микросервисов:\n        1. требуется много ресурсов для прогона и в один момент времени возможен только один сценарий;\n        1. на поднятие всех сервисов требуется много времени;\n        1. очень сложно разбираться в ошибках.\n    1. Мокировать внешние сервисы:\n        1. при изменении протокола или поведения мы не можем быть уверены, что никто не отвалится.\n    \n1. Contract driven development (CDD):\n    1. Мы создаем описание нашего контракта на Producer, по этому контракту генерируются unit-тесты на контроллеры. Тем\n       самым мы гарантируем, что на Producer контроллеры обрабатывают именно такое API.\n    1. После этого описание заливается в nexus (или другое хранилище артефактов, возможно локальное) или в git.\n    1. На стороне Consumer поднимается легковесный сервер wiremock, для него указывается файл json, предоставленный\n       Producer, в котором описаны запросы и ответы.\n\n1. Посмотрим, как это выглядит в действии.\u003cbr\u003e\n   Три сервиса: склад (Warehouse), заказы (Order), доставка (Delivery).\n    1. Warehouse публикует контракт:\n        - Получить информацию о всех вещах на складе `GET /items?page=\\\u003cpage\u003e\u0026size=\\\u003csize\u003e`\n        - Зарезервировать заказ для пользователя `POST /items/take (body: { itemUids: [] })`\n        - Получить информацию о вещи `GET /items/{itemUid}/state`\n        - Выписать вещь со склада для доставки `POST /items/{itemUid}/checkout`\n    1. Остальные сервисы на своей стороне реализуют этот контракт.\n    1. На сервисах Orders и Delivery реализуем контракт и пишем тесты.\n    1. Это все публикуем в gitlab и настраиваем зависимые сборки. Чтобы при изменении в сервисе Warehouse контракт\n       публиковался и вызывалась переборка и прогон тестов на других сервисах/\n    1. Изменяем название полей, поведение методов, добавляем или удаляем поля в запрос и ответ. Любуемся что тесты на\n       других сервисах упали.\n\n1. Есть еще один очень насущный вопрос в мире микросервисов – как бы отдать пользователю актуальную удобную\n   документацию. Все, конечно, знают про OpenAPI, но часто требуют наличие какой-то бумажной или офлайн-документации.\n   Для этого существует rest-docs. Описание API генерируется по тестам на API, более того, во время работы проверяется,\n   что все поля в запросе и ответе описаны в документированном описании. Получается, что при описании в restdocs мы\n   имеем практически описание контракта.\u003cbr\u003e\n   Пример модуля, где фигурирует описание restdocs, показать как по нему сгенерировать groovy dsl контракт.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanow%2Fscc-orders","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromanow%2Fscc-orders","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanow%2Fscc-orders/lists"}