314 lines
8.2 KiB
Markdown
314 lines
8.2 KiB
Markdown
# Примеры тестирования микросервисов через 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
|