API Gateway для микросервисов на C#: полный гайд

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему вашему C# проекту нужен API Gateway?

Представьте, что вы строите современное веб-приложение на C#. У вас есть сервис пользователей, сервис заказов, сервис платежей — и каждый из них живёт на своём порту, а то и на разных серверах. Клиентское приложение (фронтенд или мобильное приложение) должно знать обо всех этих адресах, форматах данных, протоколах аутентификации. Кошмар, правда?

Здесь на сцену выходит API Gateway для C# сервисов — единая точка входа, которая берёт на себя всю "грязную работу": маршрутизацию, агрегацию ответов, проверку токенов, кэширование и балансировку нагрузки. В этой статье мы разберём, как реализовать шлюз API .NET на практике, используя современные инструменты вроде Ocelot C# и YARP .NET.

Что такое API Gateway и зачем он микросервисам?

API Gateway — это промежуточный слой между клиентами и вашими бэкенд-сервисами. Он работает как "диспетчер": принимает входящие HTTP-запросы, анализирует их и перенаправляет к нужным микросервисам C#. При этом шлюз может выполнять дополнительные задачи:

  • Маршрутизация запросов — направлять запросы к разным сервисам в зависимости от URL, заголовков или параметров.
  • Агрегация данных — собирать ответы от нескольких сервисов и возвращать единый JSON клиенту.
  • Аутентификация API Gateway — проверять JWT-токены или API-ключи до того, как запрос попадёт к сервису.
  • Балансировка нагрузки — распределять запросы между экземплярами одного сервиса.
  • Кэширование — временно хранить ответы для часто запрашиваемых данных.
  • Rate Limiting — ограничивать количество запросов от одного клиента.

Без шлюза API .NET каждый клиент должен знать архитектуру всей системы. С ним — клиент общается только с одним эндпоинтом, а всё остальное происходит "под капотом".

Два главных инструмента для API Gateway на C#

В экосистеме .NET есть два мощных решения, которые заслуживают вашего внимания:

Ocelot C#

Пожалуй, самый популярный API Gateway для C# сервисов. Ocelot — это библиотека с открытым исходным кодом, которая добавляет функции шлюза в любое ASP.NET Core приложение. Она поддерживает:

  • Маршрутизацию на основе конфигурации JSON
  • Агрегацию ответов
  • Аутентификацию и авторизацию
  • Rate limiting
  • Балансировку нагрузки (RoundRobin, LeastConnection)
  • WebSockets

YARP .NET (Yet Another Reverse Proxy)

Проект от Microsoft, который позиционируется как высокопроизводительный обратный прокси. YARP более гибкий и производительный, но требует больше ручной настройки. Отлично подходит, если вам нужен полный контроль над каждым запросом.

В этой статье мы сосредоточимся на Ocelot — он проще для старта и покрывает 90% типовых задач.

Создаём API Gateway на C# с Ocelot: пошаговый гайд

Давайте напишем реальный код. Мы создадим шлюз API .NET, который будет маршрутизировать запросы к двум микросервисам: UserService (порт 5001) и OrderService (порт 5002).

Шаг 1: Создаём проект

Откройте терминал и выполните:

dotnet new webapi -n ApiGatewayDemo
cd ApiGatewayDemo

Установите пакет Ocelot:

dotnet add package Ocelot

Шаг 2: Настраиваем конфигурацию маршрутов

Создайте файл ocelot.json в корне проекта. В нём мы опишем правила маршрутизации:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/users/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/users/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST", "PUT", "DELETE" ]
    },
    {
      "DownstreamPathTemplate": "/api/orders/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5002
        }
      ],
      "UpstreamPathTemplate": "/orders/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST" ]
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000"
  }
}

Обратите внимание: клиент будет обращаться к /users/123, а Ocelot перенаправит запрос на http://localhost:5001/api/users/123. Это классическая маршрутизация запросов через шлюз.

Шаг 3: Подключаем Ocelot в Program.cs

Откройте Program.cs и настройте встроенный DI-контейнер:

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

// Добавляем конфигурацию из ocelot.json
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

// Регистрируем Ocelot
builder.Services.AddOcelot(builder.Configuration);

var app = builder.Build();

app.UseRouting();

// Запускаем middleware Ocelot
await app.UseOcelot();

app.Run();

Запустите ваш шлюз:

dotnet run --urls "http://localhost:5000"

Готово! Теперь все запросы к http://localhost:5000/users/* будут автоматически перенаправляться в UserService, а к http://localhost:5000/orders/* — в OrderService. Это базовая, но уже полезная реализация API Gateway для C# сервисов.

Добавляем аутентификацию и авторизацию

Одна из главных задач шлюза API .NET — централизованная аутентификация API Gateway. Вместо того чтобы проверять JWT-токены в каждом микросервисе, мы сделаем это один раз на уровне шлюза.

Установите пакет для JWT-аутентификации:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Обновите Program.cs:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Ocelot.D                

Блоги

Рекомендаций по книгам