Шлюз API предоставляет механизм, с помощью которого компоненты пользовательского интерфейса приложения могут подключаться к серверным службам для обмена данными. В этой статье представлена концепция шлюза API, обсуждаются различия между шлюзом API и обратным прокси-сервером, а также показано, как можно реализовать шлюз API с помощью YARP (еще один обратный прокси) в ASP.NET Core.
В этой статье мы будем использовать микросервисы, созданные в моей предыдущей статье. Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Что такое шлюз API?
Шлюз API предоставляет клиентам или потребителям услуг единую точку входа для доступа к внутренним службам. Шлюз API принимает вызовы от клиентских приложений и перенаправляет их соответствующим сервисам. В качестве центральной точки контроля между клиентами и службами шлюз API можно использовать для реализации ограничения скорости, безопасности, балансировки нагрузки, маршрутизации и мониторинга. Это также помогает обеспечить слабую связь, безопасность, масштабируемость и высокую доступность.
Шлюз API — это особый вид обратного прокси. Обратный прокси-сервер — это сервер, который находится между клиентами и серверными службами и распределяет клиентские запросы по нескольким машинам. Обратный прокси — хороший выбор для кэширования, безопасности и балансировки нагрузки. Клиенты могут вызывать нижестоящие службы только через обратный прокси-сервер, который пересылает запросы соответствующему нижестоящему сервису.
В следующих разделах мы рассмотрим, как реализовать шлюз API с использованием YARP в ASP.NET Core.
Создайте проект веб-API ASP.NET Core в Visual Studio 2022.
Прежде всего давайте создадим проект веб-API ASP.NET Core в Visual Studio 2022. Выполните действия, описанные ниже.
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальные API)». В этом проекте мы не будем использовать минимальные API.
- В другом месте окна «Дополнительная информация» оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию) и убедитесь, что флажки «Включить поддержку Open API», «Настроить HTTPS» и «Включить Docker» остаются снятыми. Мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Мы будем использовать этот проект веб-API ASP.NET Core для реализации шлюза API с YARP в разделах ниже. В частности, мы создадим приложение на основе микросервисов, которое включает шлюз API и три нижестоящие службы.
Установите пакет YARP NuGet.
Затем добавьте пакет YARP NuGet в проект веб-API, который вы только что создали в Visual Studio. Для этого выберите проект в окне обозревателя решений, щелкните правой кнопкой мыши и выберите «Управление пакетами NuGet». В окне диспетчера пакетов NuGet найдите пакет Yarp.ReverseProxy и установите его.
Кроме того, вы можете установить пакет YARP через консоль диспетчера пакетов NuGet, введя строку, показанную ниже.
PM> Install-Package Yarp.ReverseProxy
Настройка YARP в ASP.NET Core
Предполагая, что пакет NuGet Yarp.ReverseProxy успешно установлен в вашем проекте, теперь вам следует настроить YARP в файле Program.cs вашего проекта ASP.NET Core. Вы можете настроить YARP, используя следующий фрагмент кода.
var builder = WebApplication.CreateBuilder(args); builder.Services .AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("Yarp")); var app = builder.Build(); app.MapReverseProxy(); app.Run();
Метод AddReverseProxy используется для добавления необходимых сервисов для работы YARP. Метод LoadFromConfig загружает конечные точки и информацию об их маршрутизации из файла конфигурации. Наконец, метод MapReverseProxy добавляет маршруты обратного прокси-сервера в таблицу маршрутизации.
Укажите информацию о маршруте в YARP
YARP использует маршруты и кластеры для указания конфигурации маршрута. В то время как маршруты используются для указания шаблонов запросов, кластеры используются для указания служб, куда должны перенаправляться запросы.
Ниже приведен полный исходный код конфигурации, которую мы будем использовать в этом примере. Как видите, существует три маршрута: маршрут клиентов, маршрут поставщиков и маршрут продуктов.
"Yarp": { "Routes": { "customers-route": { "ClusterId": "customers-cluster", "Match": { "Path": "/customers/{**catch-all}" }, "Transforms": [ { "PathPattern": "{**catch-all}" } ] }, "suppliers-route": { "ClusterId": "suppliers-cluster", "Match": { "Path": "/suppliers/{**catch-all}" }, "Transforms": [ { "PathPattern": "{**catch-all}" } ] }, "products-route": { "ClusterId": "products-cluster", "Match": { "Path": "/products/{**catch-all}" }, "Transforms": [ { "PathPattern": "{**catch-all}" } ] } }, "Clusters": { "customers-cluster": { "Destinations": { "destination1": { "Address": "http://localhost:5198/api/customer" } } }, "suppliers-cluster": { "Destinations": { "destination1": { "Address": "http://localhost:5054/api/supplier" } } }, "products-cluster": { "Destinations": { "destination1": { "Address": "http://localhost:6982/api/product" } } } } }
Внедрить ограничение скорости
Ограничение скорости — это стратегия, используемая для ограничения количества запросов, которые вашим клиентам API разрешено отправлять к API. Ограничение скорости помогает защитить ваше приложение и снизить нагрузку на ваши API. Вы также можете использовать YARP для реализации ограничения скорости в вашем шлюзе API.
Следующий фрагмент кода иллюстрирует, как можно определить политику ограничения скорости в Yarp.
builder.Services.AddRateLimiter(rateLimiterOptions => { rateLimiterOptions.AddFixedWindowLimiter("fixed", options => { options.Window = TimeSpan.FromSeconds(5); options.PermitLimit = 2; }); });
Реализация аутентификации и авторизации
Вы можете обеспечить аутентификацию и авторизацию в шлюзе API, используя следующий фрагмент кода в файле Program.cs.
builder.Services.AddAuthorization(options => { options.AddPolicy("secure", policy => policy.RequireAuthenticatedUser()); });
Затем вам следует вызвать методы UseAuthentication и UseAuthorization, чтобы повысить безопасность конвейера обработки запросов.
app.UseAuthentication(); app.UseAuthorization(); app.MapReverseProxy();
Проверьте шлюз API
Чтобы протестировать шлюз API, который мы создали в этом примере, запустите все четыре приложения, т. е. шлюз API и микросервисы клиентов, поставщиков и продуктов. Теперь запустите Postman и выполните следующую конечную точку.
http://localhost:5198/customers/1
Предполагая, что вы установили точки останова в классе CustomerController, относящиеся к микросервису клиентов, вы увидите, что конечная точка достигнута, как показано на рисунке 1 ниже.
Рисунок 1. Шлюз API в действии!
YARP прост в настройке и использовании. Вы можете узнать больше о YARP и всех его функциях из документации YARP.