Что такое API Gateway в контексте микросервисной архитектуры

Ответ

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.