mirror of
https://github.com/3ybactuk/marketplace-go-service-project.git
synced 2025-10-30 05:53:45 +03:00
152 lines
4.8 KiB
Markdown
152 lines
4.8 KiB
Markdown
# 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`)
|