Skip to content

REDKARASIK/web_demoservice

Repository files navigation

📦 Web Demoservice

Go Docker Postgres Kafka

Мини-сервис для обработки заказов: читает события из Kafka (Redpanda), сохраняет их в PostgreSQL и отдаёт через HTTP API и простую веб-страницу.

UI Screenshot


Архитектура

  • Ingest: Kafka consumer (Redpanda) читает события из orders, валидирует вход и преобразует DTO в доменную модель. Ошибки уходят в DLQ.
  • Service: OrderService пишет заказ в БД в транзакции и обслуживает чтение.
  • Storage: PostgreSQL с разнесением по схемам orders и banks.
  • Cache: in-memory кэш по order_id с TTL, прогрев из БД за последние 24 часа.
  • Transport: HTTP API GET /api/v1/order/{order_id} и статическая страница web/index.html.

Почему так

  • Kafka/Redpanda: входящие события приходят асинхронно, нужен устойчивый консьюмер.
  • Postgres: нормализованные таблицы и транзакционные upsert-операции.
  • Кэш: ускорение частых чтений, отдельный прогрев при старте.
  • Отдельные схемы orders и banks: логическое разделение доменов.

Структура БД

Схемы: orders, banks.

Таблицы:

  • orders.orders: основной заказ (order_id UUID PK).
  • orders.delivery: доставка, связь 1:1 по order_id.
  • orders.payments: платеж, связь 1:1 по order_id, ссылка на banks.banks.
  • orders.items: товары, уникальные по rid.
  • orders.order_items: связь M:N между заказами и товарами.
  • banks.banks: справочник банков.

Связи:

  • orders.delivery.order_id -> orders.orders.order_id (1:1).
  • orders.payments.order_id -> orders.orders.order_id (1:1).
  • orders.payments.bank_id -> banks.banks.id (N:1).
  • orders.order_items -> orders.orders и orders.items (M:N).

Интерфейс

  • HTTP API: GET /api/v1/order/{order_id} возвращает JSON заказа.
  • Web UI: web/index.html (форма поиска order_id, вывод JSON).

Порты

  • 8080 — приложение (HTTP API + статика).
  • 8081 — Redpanda Console (веб-интерфейс Kafka).
  • 5432 — PostgreSQL.
  • 19092 — Kafka внешняя точка (localhost для клиентов).
  • 9092 — Kafka внутренняя точка (docker network).

Возможности

  • Консьюмер Kafka (через franz-go/kgo)
  • PostgreSQL (таблицы orders, delivery, payment, item)
  • Upsert заказов и связанных сущностей
  • Кэш заказов в памяти (по order_uid)
  • DLQ для невалидных/ошибочных сообщений (orders_dlq)
  • Генератор тестовых сообщений (валидных и невалидных) cmd/producer
  • HTTP API для получения заказа
  • Простой фронтенд (web/index.html)
  • Трейсы и логи через декораторы на слоях service/handlers/repository/cache; метрики (Prometheus /metrics)

⚙️ Запуск

# собрать и запустить сервисы
docker compose up -d --build

# смотреть логи приложения
docker compose logs -f app

# открыть фронт в браузере
http://localhost:8080

Kafka topics

  • Основной: orders
  • DLQ: orders_dlq (создаётся redpanda-init при старте)

Producer (генерация сообщений)

go run ./cmd/producer --brokers=localhost:19092 --topic=orders --count=100 --invalid-rate=0.3

Если запускаешь внутри docker‑сети, используй --brokers=redpanda:9092.

Observability

Метрики

По умолчанию доступны по пути /metrics. Если используешь docker compose, Prometheus поднимется на http://localhost:9090 и уже настроен на скрейп app:8080/metrics. Пример запроса в UI: http_requests_total.

Дополнительные метрики:

  • storage_ops_total{store,op,result} — чтение/запись по cache и db.
  • repository_up{repo} — доступность репозитория (ping).

Трейсы (OpenTelemetry)

Включаются через конфиг:

[telemetry]
enabled = true
service_name = "web_demoservice"
otlp_endpoint = "localhost:4317"
otlp_insecure = true
sample_ratio = 1.0

Если enabled=false, трейсинг отключён. Контекст из Kafka прокидывается через headers и продолжается в service/repository/cache через декораторы.

Логи

HTTP хэндлеры и сервис обёрнуты логирующими декораторами.

Тесты

# unit
go test ./...

# integration (нужна поднятая БД + миграции)
TEST_DB_DSN="postgres://demoservice:demoservice_pass@localhost:5432/demoservice_db?sslmode=disable" \
go test -tags=integration ./internal/repository -run TestOrderPostgresRepository_CreateAndGet

Юнит-тесты покрывают кэш и Kafka producer.

Makefile

Короткие команды-обертки над docker compose:

make up        # db + миграции + kafka + app + prometheus
make down      # остановка всех сервисов
make logs      # логи app + db
make build     # сборка app
make restart   # перезапуск app + tail логов
make lint      # статический анализ (golangci-lint)
make obs-up    # Prometheus

Линтер и форматирование

Линтер: golangci-lint, настройки в .golangci.yml.

# линт
make lint

# форматирование (goimports)
golangci-lint fmt

About

A Go service that consumes order events from Kafka (Redpanda), validates them, stores them in PostgreSQL, and serves them via an HTTP API and a simple web UI. It includes an in‑memory cache with warm‑up, a DLQ for invalid/failed messages, a test data producer (valid/invalid), Prometheus metrics, and OpenTelemetry tracing.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages