API Gateway за допомогою Ocelot
Розпочинаємо 2025 рік новою статтею про мікросервіси та API Gateway.
У цій статті ми розглянемо створення API Gateway за допомогою бібліотеки Ocelot.
API Gateway
API Gateway діє як точка входу для доступу клієнтів до мікросервісів. Замість того, щоб викликати мікросервіси безпосередньо, клієнти викликають API Gateway, який перенаправляє запит до відповідного мікросервісу і повертає відповідь клієнту. Він працює як проміжний шар, дозволяючи змінювати запити та відповіді, що надає кілька переваг:
- Мікросервіси можуть змінюватися без впливу на клієнтів.
- Мікросервіси можуть спілкуватися за допомогою будь-якого протоколу, якщо gateway реалізує протокол, зрозумілий для клієнтів.
- Gateway може реалізувати функції, такі як автентифікація, логування, SSL, балансування навантаження тощо, без впливу на мікросервіси.
Приклад використання Gateway
gateway
Ocelot
Ocelot — це бібліотека, яка дозволяє створювати API Gateway за допомогою ASP.NET.
API Gateway з використанням Ocelot
На початку 2025 року, нова стаття про Мікросервіси та API Gateway.
У цій статті ми розглянемо створення API Gateway за допомогою бібліотеки Ocelot.
API Gateway
API Gateway є точкою входу, через яку клієнти можуть отримати доступ до мікросервісів. Замість того, щоб викликати мікросервіси безпосередньо, клієнти звертаються до API Gateway, який перенаправляє запит до відповідного мікросервісу і повертає відповідь клієнту. Він функціонує як проміжний шар, що дозволяє змінювати запити та відповіді, і це дає кілька переваг:
- Мікросервіси можуть змінюватися без впливу на клієнтів.
- Мікросервіси можуть комунікувати через будь-який протокол, якщо gateway реалізує протокол, зрозумілий для клієнтів.
- Gateway може реалізувати функції, такі як автентифікація, логування, SSL, балансування навантаження тощо, без впливу на мікросервіси.
Приклад використання Gateway
gateway
Ocelot
Ocelot — це бібліотека, яка дозволяє створювати API Gateway за допомогою ASP.NET.
Створення структури прикладу використання Ocelot
Тепер, коли ми зрозуміли значення API Gateway та що таке Ocelot, давайте розглянемо, як реалізувати його у .NET.
Створення проекту, API Gateway та API
У цьому прикладі ми створимо одну solution з Gateway Ocelot і API для споживання.
Необхідні умови: Visual Studio або VSCode та SDK .NET 8.
Створіть новий проект, WebAPI.
Створіть solution за допомогою .NET 8.
Тепер перейменуйте створений web проект на API.Gateway.
Додайте до solution новий проект API, який я назву API.Pagamentos, структура буде такою:
структура проекту
Можемо почати, або краще кажучи, працюємо з кодом
У проекті API.Gateway додамо Ocelot.
Install-Package Ocelot
Тепер проект виглядатиме так:
Щоб зробити Gateway більш потужним, додамо Swagger для всіх дочірніх API, для цього встановимо nuget пакет SwaggerForOcelot.
Install-Package MMLib.SwaggerForOcelot
Тепер це виглядатиме так у проекті:
Для спрощення прикладу ми збережемо стандартний WeatherForecastController із .NET у API.
Просто вимкнемо CORS, щоб Gateway міг зробити запит без проблем.
Program.cs для API.Pagamentos:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// cors
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.UseCors("AllowAll"); //CORS
app.Run();
Тепер створимо наш ocelot.json:
{
"Routes": [
{
"DownstreamPathTemplate": "/WeatherForecast", // приватний маршрут
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost", // хост API платежів
"Port": 5216 // порт API платежів
}
],
"UpstreamPathTemplate": "/pagamentos/weather", // публічний маршрут
"UpstreamHttpMethod": ["Get"],
"SwaggerKey": "pagamentos" // ключ Swagger
}
],
"SwaggerEndPoints": [ // конфігурація Swagger для дочірньої API
{
"Key": "pagamentos",
"Config": [
{
"Name": "pagamentos API",
"Version": "v1",
"Url": "http://localhost:5216/swagger/v1/swagger.json"
}
]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5000"
}
}
Тепер перейдемо до Program.cs для API.Gateway:
using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
using Serilog;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// health check
builder.Services
.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
// Ocelot
builder.Services.AddOcelot(builder.Configuration);
builder.Services.AddSwaggerForOcelot(builder.Configuration); // додає Swagger для Ocelot
// CORS
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
builder.Host.UseSerilog((context, services, loggerConfiguration) =>
{
//Serilog.
loggerConfiguration
.MinimumLevel.Information()
.Enrich.WithProperty("ApplicationContext", "API.Gateway")
.Enrich.FromLogContext()
.WriteTo.Console()
.ReadFrom.Configuration(context.Configuration);
});
// конфігурація Ocelot
builder.Configuration.AddJsonFile("ocelot.json");
WebApplication app = builder.Build();
// перевірка стану
app.MapHealthChecks("/hc", new HealthCheckOptions()
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
});
// swagger для ocelot, дочірні API
app.UseSwaggerForOcelotUI(opt =>
{
opt.PathToSwaggerGenerator = "/swagger/docs";
});
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(_ => { });
app.UseCors("AllowAll"); //CORS
await app.UseOcelot(); //API Gateway Ocelot
await app.RunAsync();
Тепер давайте запустимо обидва рішення, пам’ятаючи, що Swagger для шлюзу правильно завантажиться тільки після запуску API для платежів.
Запустіть API для платежів, а потім — шлюз.
Нижче, зліва, Swagger шлюзу, а зправа — сама API.
структура шлюзу з OCELOT
Github
https://github.com/marciokgr/ExemploMicroServicosOcelot
Посилання
Перекладено з: API Gateway utilizando Ocelot