Ocelot Nedir ve .NET Core Projelerinde Nasıl Kullanılır?

Ocelot, .NET Core projeleri için popüler bir açık kaynaklı API Gateway çözümüdür. Mikro servis mimarilerinde yaygın olarak kullanılan Ocelot, servisler arası istek yönlendirme, yük dengeleme, kimlik doğrulama ve yetkilendirme gibi işlemleri yönetmek için kullanılabilir. Bu makalede, Ocelot'un nasıl entegre edileceğini adım adım öğreneceğiz ve Ocelot'un başlıca özelliklerini örneklerle açıklayacağız.

Ocelot'un Başlıca Özellikleri:

  • Yük Dengeleme (Load Balancing)
  • Kimlik Doğrulama ve Yetkilendirme
  • Rate Limiting
  • Caching

1. Adım: Proje Yapısının Hazırlanması

Ocelot ile bir API Gateway oluşturmak için öncelikle proje yapısını oluşturalım ve gerekli bağımlılıkları ekleyelim.

a. Projelerin Oluşturulması

Öncelikle, OcelotApiGateway adında bir proje ve iki mikro servis (OrderService ve ProductService) oluşturun:

dotnet new web -n OcelotApiGateway
dotnet new webapi -n OrderService
dotnet new webapi -n ProductService

b. Ocelot ve JWT Bağımlılıklarının Eklenmesi

OcelotApiGateway projesine Ocelot ve Microsoft.AspNetCore.Authentication.JwtBearer NuGet paketlerini ekleyin:

dotnet add OcelotApiGateway/OcelotApiGateway.csproj package Ocelot
dotnet add OcelotApiGateway/OcelotApiGateway.csproj package Microsoft.AspNetCore.Authentication.JwtBearer

2. Adım: Ocelot Konfigürasyonunun Yapılandırılması

Ocelot, ocelot.json dosyasını kullanarak istek yönlendirmelerini ve diğer yapılandırma ayarlarını belirler. Bu dosyayı OcelotApiGateway projesinin kök dizinine ekleyin ve aşağıdaki gibi yapılandırın:

ocelot.json

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/orders",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        { "Host": "localhost", "Port": 5001 }
      ],
      "UpstreamPathTemplate": "/orders",
      "UpstreamHttpMethod": [ "Get", "Post" ]
    },
    {
      "DownstreamPathTemplate": "/api/products",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        { "Host": "localhost", "Port": 5002 }
      ],
      "UpstreamPathTemplate": "/products",
      "UpstreamHttpMethod": [ "Get", "Post" ]
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000"
  }
}

3. Adım: Ocelot'u .NET Core Uygulamasına Entegre Etmek

Şimdi, Ocelot'u .NET Core uygulamamıza entegre edeceğiz. Bu adımda, Startup.cs dosyasını güncellememiz gerekiyor.

Startup.cs

OcelotApiGateway projesinin Startup.cs dosyasını aşağıdaki gibi düzenleyin:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Ocelot.DependencyInjection;
using Ocelot.Middleware;

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOcelot();
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority = "https://your-auth-server.com";
                options.Audience = "your-api";
            });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseOcelot().Wait();
    }
}

4. Adım: Mikro Servislerin Oluşturulması

OrderService ve ProductService için basit birer Controller ekleyelim:

OrderService - Controllers/OrderController.cs

[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
    [HttpGet]
    public IActionResult GetOrders()
    {
        return Ok(new[] { "Order1", "Order2", "Order3" });
    }

    [HttpPost]
    public IActionResult CreateOrder([FromBody] string order)
    {
        return Ok($"Order '{order}' has been created.");
    }
}

ProductService - Controllers/ProductController.cs

[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase
{
    [HttpGet]
    public IActionResult GetProducts()
    {
        return Ok(new[] { "Product1", "Product2", "Product3" });
    }

    [HttpPost]
    public IActionResult CreateProduct([FromBody] string product)
    {
        return Ok($"Product '{product}' has been created.");
    }
}

5. Adım: Ocelot'un Başlıca Özelliklerinin Uygulanması

Yük Dengeleme (Load Balancing)

Ocelot, gelen isteklerin farklı sunuculara yönlendirilmesi ile yükü dengeleyebilir. Örneğin:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/orders",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        { "Host": "localhost", "Port": 5001 },
        { "Host": "localhost", "Port": 5003 }
      ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "UpstreamPathTemplate": "/orders",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000"
  }
}

Rate Limiting

Rate Limiting ile belirli bir zaman diliminde yapılan istek sayısını sınırlayabilirsiniz:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/products",
      "RateLimitOptions": {
        "EnableRateLimiting": true,
        "Period": "1m",
        "Limit": 5
      }
    }
  ]
}

Caching

Caching özelliği ile istek yanıtlarını belirli bir süre boyunca önbelleğe alabilirsiniz:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/products",
      "FileCacheOptions": {
        "TtlSeconds": 60
      }
    }
  ]
}

Bu makale ile Ocelot'un .NET Core projeleriyle nasıl entegre edileceğini ve başlıca özelliklerinin nasıl kullanılacağını öğrendik. Ocelot, mikro servis mimarilerinde önemli bir rol oynar ve bu özellikler ile güvenli ve ölçeklenebilir bir API Gateway sunar.