Проект состоит из трёх микросервисов:
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