# Примеры тестирования микросервисов через API Gateway ## Структура проекта ``` . ├── service-1-main.py # User Service ├── service-2-main.py # Order Service ├── requirements.txt # Зависимости ├── Dockerfile.service1 # Docker образ для Service 1 ├── Dockerfile.service2 # Docker образ для Service 2 └── docker-compose.yaml # Конфигурация Docker Compose ``` ## Запуск контейнеров ```bash # Построить образы и запустить контейнеры docker-compose up --build # Запустить в фоновом режиме docker-compose up -d --build # Просмотреть логи docker-compose logs -f # Остановить контейнеры docker-compose down ``` ## Service 1 - User Service (порт 8001) ### Health Check ```bash curl http://localhost:8001/ curl http://localhost:8001/health ``` ### Получить список пользователей ```bash curl http://localhost:8001/users ``` ### Получить пользователя по ID ```bash curl http://localhost:8001/users/1 ``` ### Создать нового пользователя ```bash curl -X POST http://localhost:8001/users \ -H "Content-Type: application/json" \ -d '{ "name": "Петр Иванов", "email": "petr@example.com", "age": 30 }' ``` ### Обновить пользователя ```bash curl -X PUT http://localhost:8001/users/1 \ -H "Content-Type: application/json" \ -d '{ "name": "Иван Петров (обновлено)", "email": "ivan.updated@example.com", "age": 29 }' ``` ### Удалить пользователя ```bash curl -X DELETE http://localhost:8001/users/1 ``` ### Получить статистику ```bash curl http://localhost:8001/stats ``` ## Service 2 - Order Service (порт 8002) ### Health Check ```bash curl http://localhost:8002/ curl http://localhost:8002/health ``` ### Получить список продуктов ```bash curl http://localhost:8002/products ``` ### Получить продукт по ID ```bash curl http://localhost:8002/products/1 ``` ### Создать новый продукт ```bash curl -X POST http://localhost:8002/products \ -H "Content-Type: application/json" \ -d '{ "name": "Мышка беспроводная", "price": 1500.00, "quantity": 20 }' ``` ### Обновить продукт ```bash curl -X PUT http://localhost:8002/products/1 \ -H "Content-Type: application/json" \ -d '{ "name": "Ноутбук (обновлено)", "price": 55000.00, "quantity": 3 }' ``` ### Удалить продукт ```bash curl -X DELETE http://localhost:8002/products/1 ``` ### Получить список заказов ```bash curl http://localhost:8002/orders ``` ### Получить заказ по ID ```bash curl http://localhost:8002/orders/1 ``` ### Создать новый заказ ```bash curl -X POST http://localhost:8002/orders \ -H "Content-Type: application/json" \ -d '{ "user_id": 2, "product_id": 2, "quantity": 2 }' ``` ### Получить статистику ```bash curl http://localhost:8002/stats ``` ## Тестирование через Python requests ```python import requests import json BASE_URL_SERVICE1 = "http://localhost:8001" BASE_URL_SERVICE2 = "http://localhost:8002" # Проверка здоровья Service 1 response = requests.get(f"{BASE_URL_SERVICE1}/health") print(f"Service 1 Health: {response.json()}") # Получение всех пользователей response = requests.get(f"{BASE_URL_SERVICE1}/users") print(f"Users: {response.json()}") # Создание пользователя user_data = { "name": "Тест Пользователь", "email": "test@example.com", "age": 25 } response = requests.post(f"{BASE_URL_SERVICE1}/users", json=user_data) print(f"Created User: {response.json()}") # Проверка здоровья Service 2 response = requests.get(f"{BASE_URL_SERVICE2}/health") print(f"Service 2 Health: {response.json()}") # Получение всех продуктов response = requests.get(f"{BASE_URL_SERVICE2}/products") print(f"Products: {response.json()}") # Создание заказа order_data = { "user_id": 1, "product_id": 3, "quantity": 5 } response = requests.post(f"{BASE_URL_SERVICE2}/orders", json=order_data) print(f"Created Order: {response.json()}") ``` ## Конфигурация API Gateway Для проверки работы API Gateway, вы можете использовать: 1. **Kong** - популярный API Gateway 2. **NGINX** - простой и быстрый 3. **Traefik** - автоматическое обнаружение сервисов 4. **AWS API Gateway** - облачное решение ### Пример конфигурации NGINX ```nginx upstream service1 { server service-1:8001; } upstream service2 { server service-2:8002; } server { listen 8000; server_name localhost; location /api/users { proxy_pass http://service1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /api/products { proxy_pass http://service2; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /api/orders { proxy_pass http://service2; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` ## Основные характеристики микросервисов ### Service 1 - User Service - **Порт**: 8001 - **Функционал**: Управление пользователями (CRUD) - **Endpoints**: - `GET /` - Проверка статуса - `GET /health` - Health check - `GET /users` - Список пользователей - `GET /users/{id}` - Получить пользователя - `POST /users` - Создать пользователя - `PUT /users/{id}` - Обновить пользователя - `DELETE /users/{id}` - Удалить пользователя - `GET /stats` - Статистика ### Service 2 - Order Service - **Порт**: 8002 - **Функционал**: Управление продуктами и заказами (CRUD) - **Endpoints**: - `GET /` - Проверка статуса - `GET /health` - Health check - `GET /products` - Список продуктов - `GET /products/{id}` - Получить продукт - `POST /products` - Создать продукт - `PUT /products/{id}` - Обновить продукт - `DELETE /products/{id}` - Удалить продукт - `GET /orders` - Список заказов - `GET /orders/{id}` - Получить заказ - `POST /orders` - Создать заказ - `GET /stats` - Статистика ## Логирование и мониторинг Оба сервиса включают: - Встроенное логирование (INFO уровень) - Health check endpoints - Метрики статистики - Документацию Swagger (автоматическая генерация) ### Доступ к Swagger документации - Service 1: `http://localhost:8001/docs` - Service 2: `http://localhost:8002/docs` ## Отладка ```bash # Проверить статус контейнеров docker-compose ps # Просмотреть логи конкретного сервиса docker-compose logs service-1 docker-compose logs service-2 # Подключиться к контейнеру docker-compose exec service-1 /bin/bash # Проверить сетевое подключение между сервисами docker-compose exec service-1 curl http://service-2:8002/health ``` ## Требования - Docker 20.10+ - Docker Compose 2.0+ - Python 3.11+ (для локального запуска без Docker) - curl или PostMan для тестирования API ## Лицензия MIT