Почему вашему 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