Микросервисное приложение для заказа и управления пиццей. Система состоит из нескольких сервисов, построенных на Go с использованием gRPC и REST API.
┌─────────────────────┐
│ API Gateway │ (HTTP REST на порту 8080)
│ (Reverse Proxy) │
└──────────┬──────────┘
│
┌────┴────┐
│ │
┌─────▼──────┐ ┌──────▼──────┐
│User Service│ │Card Service │ (gRPC)
│(50051) │ │(50052) │
└─────┬──────┘ └──────┬──────┘
│ │
┌─────▼──────┐ ┌──────▼──────┐
│ User DB │ │ Card DB │ (PostgreSQL)
│(54322) │ │(5433) │
└────────────┘ └─────────────┘
- REST API точка входа для клиентов
- Обратный прокси для маршрутизации запросов к микросервисам
- Аутентификация и авторизация
- Порт: 8080
- Управление пользователями
- Аутентификация (регистрация, вход)
- JWT токены (access + refresh)
- gRPC интерфейс для других сервисов
- Порт gRPC: 50051
- База данных: PostgreSQL на порту 54322
- Управление платежными картами
- Хранение информации о картах пользователей
- gRPC интерфейс
- Порт gRPC: 50052
- База данных: PostgreSQL на порту 5433
- Docker и Docker Compose
- Go 1.20+ (для локальной разработки)
- PostgreSQL client (опционально)
# Перейди в корневую папку проекта
cd /home/denis/GolandProjects/pizza-app
# Запусти все сервисы через docker-compose
docker-compose up -d
# Проверь статус контейнеров
docker-compose ps
# Просмотри логи
docker-compose logs -fdocker-compose down
# Удали также и волюмы с данными БД (если нужно сбросить данные)
docker-compose down -vБазовый URL: http://localhost:8080
POST /api/v1/auth/register
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone_number": "+7 999 999 99 99",
"password": "secure_password"
}POST /api/v1/auth/login
Content-Type: application/json
{
"email": "[email protected]",
"password": "secure_password"
}GET /api/v1/users/profile
Authorization: Bearer <ACCESS_TOKEN>PUT /api/v1/users/profile
Authorization: Bearer <ACCESS_TOKEN>
Content-Type: application/json
{
"first_name": "Jane",
"last_name": "Smith",
"phone_number": "+7 888 888 88 88"
}POST /api/v1/auth/refresh
Content-Type: application/json
{
"refresh_token": "<REFRESH_TOKEN>"
}psql -h localhost -p 54322 -U user_db_user -d user_db
# Пароль: user_db_passwordpsql -h localhost -p 5433 -U card_db_user -d card_db
# Пароль: card_db_passwordМиграции выполняются автоматически при запуске сервиса через Goose.
User Service миграции (user-service/migrations/):
01_user.sql- Таблица пользователей02_add_phone_number.sql- Добавление поля телефона03_refresh_tokens.sql- Таблица refresh токенов
Card Service миграции (card-service/migrations/):
01_card.sql- Таблица платежных карт
Приложение использует JWT токены для аутентификации:
- Access Token: Краткосрочный токен для доступа к защищённым ресурсам (15 минут)
- Refresh Token: Долгосрочный токен для получения нового access токена (7 дней)
Токены передаются в заголовке Authorization со схемой Bearer:
Authorization: Bearer <ACCESS_TOKEN>
pizza-app/
├── docker-compose.yaml # Конфигурация контейнеров
├── README.md # Этот файл
│
├── api-gateway/ # REST API Gateway
│ ├── cmd/api-gateway/main.go
│ ├── internal/
│ │ ├── app/
│ │ ├── handler/
│ │ ├── middleware/
│ │ └── router/
│ ├── Dockerfile
│ ├── go.mod
│ └── Makefile
│
├── user-service/ # User Service (gRPC)
│ ├── cmd/user-service/main.go
│ ├── api/user-service_v1/ # Proto definitions
│ ├── internal/
│ │ ├── app/
│ │ ├── config/
│ │ ├── entity/
│ │ ├── handler/
│ │ ├── middleware/
│ │ ├── repository/
│ │ ├── service/
│ │ └── utils/
│ ├── migrations/ # SQL миграции
│ ├── client/ # DB клиент
│ ├── Dockerfile
│ ├── go.mod
│ └── Makefile
│
└── card-service/ # Card Service (gRPC)
├── api/user-card_v1/ # Proto definitions
├── internal/
│ ├── config/
│ ├── entity/
│ ├── repository/
│ └── migrations/
├── client/ # DB клиент
├── Dockerfile
├── go.mod
├── config.yaml
└── Makefile
# User Service
cd user-service
make run
# API Gateway
cd api-gateway
make run
# Card Service
cd card-service
make run# Сгенерировать Go код из .proto
cd user-service
make proto
cd ../card-service
make proto# Все сервисы
docker-compose logs -f
# Конкретный сервис
docker-compose logs -f user-service
docker-compose logs -f card-service
docker-compose logs -f api-gatewayПеременные устанавливаются в docker-compose.yaml:
DB_HOST=user-db
DB_PORT=5432
DB_NAME=user_db
DB_USER=user_db_user
DB_PASSWORD=user_db_passwordDB_HOST=card-db
DB_PORT=5432
DB_NAME=card_db
DB_USER=card_db_user
DB_PASSWORD=card_db_passwordAPP_PORT=8080
APP_ENV=production
USER_SERVICE_HOST=user-service
USER_SERVICE_PORT=50051
CARD_SERVICE_HOST=card-service
CARD_SERVICE_PORT=50052
LOG_LEVEL=infoНекоторые сервисы могут использовать YAML конфиги:
user-service/config.yamlcard-service/config.yaml
1. Регистрация пользователя:
curl -X POST http://localhost:8080/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone_number": "+7 999 999 99 99",
"password": "password123"
}'2. Вход в систему:
curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "password123"
}'3. Получение профиля (требует токен):
curl -X GET http://localhost:8080/api/v1/users/profile \
-H "Authorization: Bearer <ACCESS_TOKEN>"Убедись, что все Dockerfile файлы находятся в соответствующих директориях сервисов.
Проверь, что все контейнеры запустились:
docker-compose psПроверь логи контейнера БД:
docker-compose logs user-db
docker-compose logs card-dbУбедись, что миграции находятся в правильной директории и БД полностью инициализирована. Проверь логи:
docker-compose logs user-service- gRPC Documentation
- Protocol Buffers
- Go Documentation
- PostgreSQL Documentation
- Uber/FX Dependency Injection
Проект разрабатывается в процессе обучения микросервисной архитектуре на Go.
MIT License - используй как угодно для личных и коммерческих проектов.