Ответ
API Gateway — это паттерн проектирования и сервер, который выступает как единая точка входа (single entry point) для всех клиентских запросов к бэкенд-сервисам в микросервисной архитектуре.
Вместо того чтобы клиенты напрямую обращались к множеству микросервисов, они отправляют один запрос на API Gateway, который затем маршрутизирует его к нужным сервисам, агрегирует их ответы и возвращает клиенту единый результат.
Ключевые функции:
- Маршрутизация (Routing): Перенаправляет входящие запросы на соответствующие микросервисы.
- Агрегация (Aggregation): Собирает данные из нескольких сервисов в один ответ, чтобы уменьшить количество запросов от клиента.
- Аутентификация и авторизация: Централизованно проверяет права доступа, JWT-токены или API-ключи, снимая эту задачу с каждого микросервиса.
- Балансировка нагрузки (Load Balancing): Распределяет запросы между несколькими экземплярами одного сервиса.
- Кэширование: Сохраняет ответы от сервисов для уменьшения времени отклика и нагрузки.
- Логирование и мониторинг: Является центральной точкой для сбора метрик и логов по всем входящим запросам.
Упрощенный пример агрегации на FastAPI
Этот код эмулирует работу Gateway, который для получения полной информации о заказе обращается к двум разным сервисам (сервису пользователей и сервису заказов).
from fastapi import FastAPI, HTTPException
import httpx # Асинхронная HTTP-библиотека
app = FastAPI(title="API Gateway")
# Адреса внутренних микросервисов
USERS_SERVICE_URL = "http://users-service/api/v1/users"
ORDERS_SERVICE_URL = "http://orders-service/api/v1/orders"
@app.get("/composite/order-details/{order_id}")
async def get_order_details(order_id: int):
async with httpx.AsyncClient() as client:
try:
# 1. Получаем данные о заказе
order_response = await client.get(f"{ORDERS_SERVICE_URL}/{order_id}")
order_response.raise_for_status()
order_data = order_response.json()
user_id = order_data.get("userId")
# 2. Получаем данные о пользователе по ID из заказа
user_response = await client.get(f"{USERS_SERVICE_URL}/{user_id}")
user_response.raise_for_status()
user_data = user_response.json()
# 3. Агрегируем результат
return {
"order": order_data,
"customer": user_data
}
except httpx.HTTPStatusError as e:
raise HTTPException(status_code=e.response.status_code, detail="Error fetching data from a downstream service.")
Популярные готовые решения: AWS API Gateway, Kong, Tyk, NGINX Plus.