Files
2025-09-18 16:26:07 +02:00

152 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Marketplace Microservices Platform
A **Go-based microservices marketplace platform** built step-by-step across modules. It showcases HTTP & gRPC APIs, databases, concurrency, messaging, and observability.
## Services
- **Cart** — user shopping cart (HTTP).
- **LOMS** — Logistics & Order Management (gRPC + HTTP gateway): orders, stock, reservation.
- **Comments** — item comments (HTTP).
- **Notifier** — Kafka consumer that processes order events.
Infra: PostgreSQL, Kafka, Docker Compose, Prometheus, Grafana, OpenTelemetry.
---
## Features by Module
1. **Go Basics (Cart)**
- HTTP API: add/delete/clear/list cart.
- Logging middleware, request validation, client retries.
- In-memory repository.
2. **Testing in Go**
- Unit tests for use cases & repository (minimock).
- Coverage target ≥ 60%.
- Benchmarks + e2e tests (selected handlers).
3. **Inter-service Communication (LOMS)**
- gRPC API: `OrderCreate`, `OrderInfo`, `OrderPay`, `OrderCancel`, `StocksInfo`.
- Cart → LOMS via gRPC (checkout & stock checks).
- proto-gen-validate interceptor, HTTP gateway, Swagger UI.
4. **Databases**
- LOMS uses PostgreSQL with migrations.
- Transactional order creation.
- SQLC for type-safe queries.
5. **Concurrency**
- Parallel product lookups with a custom `errgroup`.
- Client-side RPS limiting (10 RPS), context cancellation.
- Mutex-protected in-memory stores.
6. **Messaging & Outbox** *(extended)*
- Kafka outbox for order domain events (see `loms/internal/infra/messaging/kafka_outbox`).
- Notifier consumes and processes events (`notifier/internal/infra/messaging/kafka`).
7. **Observability** *(extended)*
- OpenTelemetry tracing, Prometheus metrics, Grafana dashboards.
- gRPC/HTTP middleware for logging/metrics/tracing.
8. **Production-Ready Enhancements** *(extended)*
- Dockerized services & Makefile automation.
- Graceful shutdowns, race/leak checks.
- CI-friendly lint/tests/migrations.
- End-to-end integration tests.
---
## Tech Stack
Go 1.23 • HTTP • gRPC + gRPC-Gateway • Swagger • PostgreSQL • SQLC • Kafka • OpenTelemetry • Prometheus • Grafana • Docker & Docker Compose • minimock
---
## Project Structure (high-level)
```
/cart # HTTP cart service, clients to LOMS & product-service, tests
/loms # gRPC LOMS service (orders, stocks), DB layer (sqlc), gateway, swagger
/comments # Comments service (HTTP, Postgres repository)
/notifier # Kafka consumer (order events)
/prometheus # Prometheus config
/grafana_data # Local Grafana storage
/docker-compose.yaml
/Makefile # build/run/test targets
```
(See service-specific folders for `configs`, `db/migrations`, and `Makefile` targets.)
---
## Run Locally
```bash
make run-all
```
Starts services (`cart`, `loms`, `comments`, `notifier`) plus dependencies (PostgreSQL, Kafka), applies migrations, and exposes UIs.
**Default ports**
- Cart HTTP: `http://localhost:8080`
- LOMS gRPC-Gateway & Swagger: `http://localhost:8081`
- Product service (mock): `http://localhost:8082/docs`
- Prometheus: `http://localhost:9090`
- Grafana: `http://localhost:3000`
> Auth to product-service via `X-API-KEY: testToken`.
---
## Key APIs
### Cart (HTTP)
- `POST /user/{user_id}/cart/{sku}` — add item (validates via product-service; checks stock via LOMS).
- `DELETE /user/{user_id}/cart/{sku}` — remove item.
- `DELETE /user/{user_id}/cart` — clear cart.
- `GET /user/{user_id}/cart` — list cart (sorted by SKU).
- `POST /checkout/{user_id}` — create order in LOMS from cart.
### LOMS (gRPC + HTTP Gateway)
- `OrderCreate`, `OrderInfo`, `OrderPay`, `OrderCancel`
- `StocksInfo` — available to buy (total reserved)
Swagger (when enabled):
- LOMS: `http://localhost:8081/docs`
- Product mock: `http://localhost:8082/docs`
---
## Happy Path (Example Flow)
1. `POST /user/{user_id}/cart/{sku}` — Add item to cart (checks product exists and stock is sufficient).
2. `GET /user/{user_id}/cart` — Verify cart contents.
3. `POST /checkout/{user_id}` — Create an order in LOMS.
4. `POST /order/pay` (LOMS) — Pay the order with body `{ "orderId": <id> }`.
5. Optionally, `POST /order/cancel` (LOMS) before payment to cancel the order.
---
## Development
**Makefile highlights**
- `make run-all` — build & run full stack
- `make test` — unit tests (minimock)
- `make lint` — lint (incl. cyclomatic/cognitive complexity)
- `make cover` — coverage report
- `make gen` — proto & SQLC codegen
**Testing**
- Unit tests for use cases & repositories
- e2e tests for selected handlers
- Benchmarks for in-memory storage
- Race detector & goroutine leak checks (where applicable)
---
## Observability
- Tracing via OpenTelemetry (`internal/infra/tracing`)
- Metrics via Prometheus (`/prometheus/prometheus.yml`)
- Dashboards in Grafana (`/grafana_data`)