f76982bb57cd45c5335796a4cbf0a5c3e8026d6c
Примеры тестирования микросервисов через 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
Запуск контейнеров
# Построить образы и запустить контейнеры
docker-compose up --build
# Запустить в фоновом режиме
docker-compose up -d --build
# Просмотреть логи
docker-compose logs -f
# Остановить контейнеры
docker-compose down
Service 1 - User Service (порт 8001)
Health Check
curl http://localhost:8001/
curl http://localhost:8001/health
Получить список пользователей
curl http://localhost:8001/users
Получить пользователя по ID
curl http://localhost:8001/users/1
Создать нового пользователя
curl -X POST http://localhost:8001/users \
-H "Content-Type: application/json" \
-d '{
"name": "Петр Иванов",
"email": "petr@example.com",
"age": 30
}'
Обновить пользователя
curl -X PUT http://localhost:8001/users/1 \
-H "Content-Type: application/json" \
-d '{
"name": "Иван Петров (обновлено)",
"email": "ivan.updated@example.com",
"age": 29
}'
Удалить пользователя
curl -X DELETE http://localhost:8001/users/1
Получить статистику
curl http://localhost:8001/stats
Service 2 - Order Service (порт 8002)
Health Check
curl http://localhost:8002/
curl http://localhost:8002/health
Получить список продуктов
curl http://localhost:8002/products
Получить продукт по ID
curl http://localhost:8002/products/1
Создать новый продукт
curl -X POST http://localhost:8002/products \
-H "Content-Type: application/json" \
-d '{
"name": "Мышка беспроводная",
"price": 1500.00,
"quantity": 20
}'
Обновить продукт
curl -X PUT http://localhost:8002/products/1 \
-H "Content-Type: application/json" \
-d '{
"name": "Ноутбук (обновлено)",
"price": 55000.00,
"quantity": 3
}'
Удалить продукт
curl -X DELETE http://localhost:8002/products/1
Получить список заказов
curl http://localhost:8002/orders
Получить заказ по ID
curl http://localhost:8002/orders/1
Создать новый заказ
curl -X POST http://localhost:8002/orders \
-H "Content-Type: application/json" \
-d '{
"user_id": 2,
"product_id": 2,
"quantity": 2
}'
Получить статистику
curl http://localhost:8002/stats
Тестирование через Python requests
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, вы можете использовать:
- Kong - популярный API Gateway
- NGINX - простой и быстрый
- Traefik - автоматическое обнаружение сервисов
- AWS API Gateway - облачное решение
Пример конфигурации 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 checkGET /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 checkGET /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
Отладка
# Проверить статус контейнеров
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
Languages
Python
100%