{"id":20298473,"url":"https://github.com/wellers/shop","last_synced_at":"2026-04-10T00:07:40.518Z","repository":{"id":234944340,"uuid":"781237449","full_name":"wellers/shop","owner":"wellers","description":"Shop microservices for Kubernetes.","archived":false,"fork":false,"pushed_at":"2025-02-25T22:18:22.000Z","size":290,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-25T23:28:29.764Z","etag":null,"topics":["dotnet","graphql","grpc","helm-charts","kubernetes","postgresql","rabbitmq","redis"],"latest_commit_sha":null,"homepage":"","language":"C#","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/wellers.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":"2024-04-03T02:09:32.000Z","updated_at":"2025-02-25T22:18:25.000Z","dependencies_parsed_at":"2024-04-21T18:27:19.518Z","dependency_job_id":"2abb1bce-50d2-40bc-8f8b-3cfadde99603","html_url":"https://github.com/wellers/shop","commit_stats":null,"previous_names":["wellers/shop"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wellers/shop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellers%2Fshop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellers%2Fshop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellers%2Fshop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellers%2Fshop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wellers","download_url":"https://codeload.github.com/wellers/shop/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellers%2Fshop/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264432537,"owners_count":23607445,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["dotnet","graphql","grpc","helm-charts","kubernetes","postgresql","rabbitmq","redis"],"created_at":"2024-11-14T16:09:51.117Z","updated_at":"2026-04-10T00:07:40.513Z","avatar_url":"https://github.com/wellers.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shop Microservices\nA containerised, distributed shopping platform built with .NET 8, demonstrating microservices architecture, event-driven communication, polyglot persistence, and Kubernetes-based deployment.\n\nThis project showcases production-style backend design patterns including API gateway routing, asynchronous messaging, and service isolation.\n\n## Architecture Overview\nThe system is composed of independent microservices communicating via REST and message queues, deployed in containers and exposed via an Nginx gateway.\n\nHigh-level flow:\n1. Customers create baskets via the Basket service.\n2. When a basket is purchased, a message is published to RabbitMQ.\n3. The Booking service consumes the event and persists the booking.\n4. The Booking service then publishes a booking completed event.\n5. The Basket service consumes the event to clear the Redis basket.\n6. The Mailout service consumes the event to simulate sending a confirmation email.\n7. Product data is exposed via a GraphQL Catalog service backed by MongoDB.\n\n## Microservices\n\n### Basket Service\n* .NET 8 REST API\n* Redis-backed basket storage\n* Publishes purchase events to RabbitMQ\n* Consumes booking completed events to clear purchased baskets\n* Demonstrates ephemeral, high-performance state handling\n\n### Booking Service\n* .NET 8 background consumer\n* Subscribes to basket purchase events\n* Persists bookings to Postgres\n* Publishes booking completed events\n* Demonstrates asynchronous, event-driven workflows\n\n### Catalog Service\n* GraphQL API\n* MongoDB persistence\n* Scheduled job to populate product data\n* Demonstrates flexible querying and polyglot persistence\n\n### Mailout Service\n* .NET 8 background worker service\n* Subscribes to booking completed events\n* Simulates sending customer confirmation emails\n* Demonstrates additional event-driven consumers within the architecture\n\n### API Gateway (Kube-Proxy)\n* Nginx reverse proxy\n* Routes external traffic into the Kubernetes cluster\n* Demonstrates gateway pattern in microservices architecture\n\n### Internal Communication\n* gRPC used for efficient internal service-to-service communication\n* RabbitMQ used for asynchronous event propagation\n* Multiple services consume events (Booking, Basket, Mailout)\n* Clear separation between synchronous and asynchronous workflows\n\nThis reflects real-world distributed system design patterns.\n\n## Shared Infrastructure\n* RabbitMQ (message broker)\n* Redis (basket storage)\n* Postgres (booking persistence)\n* MongoDB (catalog storage)\n* pgAdmin (database management)\n* Docker / Docker Compose\n* Kubernetes deployment configuration\n\n## Key Architectural Patterns Demonstrated\n* Microservices decomposition\n* Event-driven architecture\n* Asynchronous messaging\n* gRPC internal communication\n* Polyglot persistence\n* API gateway pattern\n* Containerised services\n* Kubernetes networking\n* Background processing\n* REST + GraphQL coexistence","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwellers%2Fshop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwellers%2Fshop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwellers%2Fshop/lists"}