Skip to content

Репозиторий для заданий по Go

Notifications You must be signed in to change notification settings

MariianUm/Go-project

Repository files navigation

Finance API - микросервисная архитектура для управления финансами

АРХИТЕКТУРА

Проект состоит из трёх микросервисов:

Gateway (порт 8080):

  • Принимает HTTP запросы от клиентов
  • Проверяет JWT токены для авторизации через Auth Service
  • Проксирует запросы в Ledger Service через gRPC
  • Предоставляет RESTful API для работы с финансами

Auth Service (порт 50051):

  • gRPC сервер для аутентификации и авторизации
  • Регистрация и логин пользователей
  • Валидация JWT токенов
  • Blacklist токенов при logout через Redis
  • Хранение пользователей в PostgreSQL

Ledger Service (порт 50052):

  • gRPC сервер для финансовых операций
  • Вся бизнес-логика (транзакции, бюджеты, отчеты)
  • Валидация транзакций
  • Проверка бюджетных лимитов
  • Кеширование отчетов в Redis
  • Инвалидация кеша при обновлении данных
  • Работа с PostgreSQL (транзакции, бюджеты)

Вспомогательные сервисы:

  • PostgreSQL (порт 5433) - основное хранилище данных
  • Redis (порт 6379) - кеширование и blacklist токенов

Взаимодействие: Client → Gateway (HTTP) → Auth Service (gRPC) → Ledger Service (gRPC) → PostgreSQL + Redis

ЗАПУСК

# Полная сборка и запуск
docker compose down 2>/dev/null
docker compose up --build

# Или запуск в фоновом режиме
docker compose up -d
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
Сервисы используют следующие переменные окружения:

Auth Service:

JWT_SECRET - секретный ключ для JWT токенов

REDIS_ADDR - адрес Redis сервера (по умолчанию: redis:6379)

Ledger Service:

REDIS_ADDR - адрес Redis сервера (по умолчанию: redis:6379)

PostgreSQL (в docker-compose):

POSTGRES_USER - пользователь БД (по умолчанию: user)

POSTGRES_PASSWORD - пароль БД (по умолчанию: pass)

POSTGRES_DB - имя БД (по умолчанию: ledger)

API ENDPOINTS
Авторизация:
POST /register - регистрация пользователя

POST /login - получение JWT токена

POST /logout - выход из системы (инвалидация токена)

Транзакции:
POST /transaction - создать транзакцию (требуется Authorization header)

Бюджеты:
POST /set_budget - установить бюджет на категорию

GET /get_budgets - список всех бюджетов пользователя (кешируется в Redis)

Отчеты:
GET /report - финансовый отчет по категориям (кешируется в Redis)

ПРИМЕРЫ ЗАПРОСОВ
Регистрация:
bash
curl -X POST http://localhost:8080/register \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com", "password":"password123"}'
Логин (получение токена):
bash
curl -X POST http://localhost:8080/login \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com", "password":"password123"}'
Ответ: {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}

Создание транзакции:
bash
curl -X POST http://localhost:8080/transaction \
  -H "Content-Type: application/json" \
  -H "Authorization: YOUR_JWT_TOKEN" \
  -d '{"amount": 1500, "category": "salary", "description": "Зарплата"}'
Установка бюджета:
bash
curl -X POST http://localhost:8080/set_budget \
  -H "Content-Type: application/json" \
  -H "Authorization: YOUR_JWT_TOKEN" \
  -d '{"category": "food", "limitAmount": 5000}'
Получение отчета:
bash
curl -X GET http://localhost:8080/report \
  -H "Authorization: YOUR_JWT_TOKEN"
Важно: Если транзакция превышает установленный бюджет, вернется ошибка и транзакция не будет создана.

GOOGLE APPS SCRIPT
В файле google_scrips.js находится скрипт для интеграции с Google Sheets.


Создание пользователя (перед первым входом):
bash
curl -X POST http://localhost:8080/register \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com", "password":"password123"}'
Вход в Google Sheets:
Меню "Finance API""Войти"

Email: user@example.com

Password: password123

После успешного входа в меню появится "Finance API" с доступными операциями.

ТЕСТИРОВАНИЕ РАБОТОСПОСОБНОСТИ
Проверка кеширования Redis:
Выполните запрос отчета дважды:

bash
curl -X GET http://localhost:8080/report -H "Authorization: YOUR_TOKEN"
Проверьте логи Ledger Service:

bash
docker compose logs ledger-service | grep -i "cache"
В логах будет видно "Cache HIT" при повторном запросе.

Проверка blacklist токенов:
Выполните logout:

bash
curl -X POST http://localhost:8080/logout -H "Authorization: YOUR_TOKEN"
Попробуйте использовать тот же токен для запроса:

bash
curl -X GET http://localhost:8080/report -H "Authorization: INVALIDATED_TOKEN"
Должна вернуться ошибка 401 Unauthorized.

ТЕХНОЛОГИИ
Go 1.24 - основной язык разработки

PostgreSQL - реляционная база данных

Redis - кеширование и управление токенами

gRPC - межсервисная коммуникация

Docker & Docker Compose - контейнеризация

JWT - аутентификация

Google Sheets API - интеграция с таблицами

СТРУКТУРА ПРОЕКТА
text
Go-project/
├── auth/                    # Auth Service
│   ├── main.go            # Точка входа
│   └── Dockerfile         # Docker образ
├── ledger/                 # Ledger Service
│   ├── main.go            # Точка входа
│   ├── validation.go      # Валидация транзакций
│   ├── cache/             # Redis клиент
│   └── Dockerfile         # Docker образ
├── gateway/                # API Gateway
│   ├── main.go            # Точка входа
│   └── Dockerfile         # Docker образ
├── proto/                  # Protobuf определения
│   ├── pb_auth/           # gRPC для Auth Service
│   └── pb_ledger/         # gRPC для Ledger Service
├── docker-compose.yml     # Конфигурация Docker Compose
├── google_scrips.js       # Google Apps Script интеграция
├── go.mod                 # Зависимости Go
└── README.md              # Документация
СООТВЕТСТВИЕ КРИТЕРИЯМ
ОСНОВНЫЕ КРИТЕРИИ:
✅ Микросервисная архитектура (3 отдельных сервиса)

✅ gRPC коммуникация между сервисами

✅ PostgreSQL для хранения данных

✅ Redis для кеширования и blacklist токенов

✅ JWT аутентификация с blacklist

✅ Бизнес-правила (проверка бюджетных лимитов)

✅ Валидация данных на всех уровнях

✅ Docker Compose для простого развертывания

✅ Полная документация с примерами запросов

ДОПОЛНИТЕЛЬНЫЕ КРИТЕРИИ:
✅ Google Sheets интеграция через Apps Script

✅ Кеширование отчетов в Redis с инвалидацией

✅ Graceful shutdown и health checks

✅ Логирование всех операций

КЕШИРОВАНИЕ В REDIS:
✅ Кеширование финансовых отчетов (GetReport)

✅ Кеширование списков бюджетов (GetBudgets)

✅ Инвалидация кеша при обновлении данных

✅ Настройка TTL через конфигурацию

✅ Логирование cache hit/miss

ЗАПУСК БЕЗ DOCKER
Требования:
Go 1.24+

PostgreSQL 15+

Redis 7+

Установленные зависимости: go mod download

Запуск Auth Service:
bash
cd auth
export JWT_SECRET="supersecret"
export REDIS_ADDR="localhost:6379"
go run main.go
Запуск Ledger Service:
bash
cd ledger
export REDIS_ADDR="localhost:6379"
go run main.go
Запуск Gateway:
bash
cd gateway
go run main.go
УСТРАНЕНИЕ НЕПОЛАДОК
Проблема: "Port 5432 is already in use"
bash
# Остановите локальный PostgreSQL
brew services stop postgresql

# Или найдите и завершите процесс
sudo lsof -ti:5432 | xargs kill -9
Проблема: "relation 'users' does not exist"
bash
# Проверьте логи Auth Service
docker compose logs auth-service

# Создайте таблицу вручную
docker exec -it go-project-postgres-1 psql -U user -d ledger -c "CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, email TEXT UNIQUE, password_hash TEXT);"
Проблема: Контейнеры не запускаются
bash
# Полная пересборка
docker compose down -v
docker compose build --no-cache
docker compose up

About

Репозиторий для заданий по Go

Resources

Stars

Watchers

Forks

Packages

No packages published