Tunahan ÖZCAN

.NET Core Mikroservis Projelerinde Ocelot ile Load Balance Uygulama

.NET Core mikroservis mimarisinde Ocelot kullanarak load balance (yük dengeleme) uygulamasını adım adım anlatan bir rehber.

Mikroservis mimarisi, uygulamaları küçük, bağımsız ve ölçeklenebilir parçalara ayırarak geliştirme, dağıtım ve yönetim süreçlerini kolaylaştırır. Ancak, bu mimari ile birlikte gelen karmaşıklıkları yönetmek için API Gateway gibi araçlara ihtiyaç duyulur. Ocelot, .NET Core tabanlı bir API Gateway çözümüdür ve yük dengeleme (load balancing) gibi birçok özelliği bünyesinde barındırır. Bu makalede, .NET Core mikroservis projelerinde Ocelot ile nasıl yük dengeleme uygulayacağımızı adım adım inceleyeceğiz.

Temel Kavramlar

  • Mikroservis: Uygulamanın bağımsız, küçük parçalara ayrılmış halidir. Her bir servis, belirli bir işlevselliği yerine getirir ve kendi veritabanına sahip olabilir.
  • API Gateway: Mikroservisler önünde duran ve istemcilerden gelen istekleri uygun servislere yönlendiren bir katmandır. Ocelot, popüler bir .NET Core API Gateway çözümüdür.
  • Load Balance (Yük Dengeleme): Gelen istekleri birden fazla sunucuya dağıtarak, tek bir sunucunun aşırı yüklenmesini önler ve uygulamanın performansını artırır.

Ocelot'un Avantajları

  • Yönlendirme: İstekleri belirli kurallara göre mikroservislere yönlendirir.
  • Kimlik Doğrulama ve Yetkilendirme: İstekleri doğrular ve yetkilendirme işlemlerini gerçekleştirir.
  • Yük Dengeleme: İstekleri birden fazla sunucuya dağıtır.
  • Rate Limiting (Hız Sınırlandırma): İstek sayısını belirli bir süre içinde sınırlar.
  • Caching (Önbellekleme): Sık erişilen verileri önbelleğe alarak performansı artırır.

Proje Yapısı

Bu makalede, basit bir e-ticaret uygulamasının mikroservis mimarisini örnek olarak kullanacağız.

  • Ürün Servisi (Product Service): Ürün bilgilerini yöneten servis.
  • Sipariş Servisi (Order Service): Sipariş işlemlerini yöneten servis.
  • Ocelot API Gateway: İstemcilerden gelen istekleri uygun servislere yönlendiren API Gateway.

Adım 1: .NET Core Projelerini Oluşturma

İlk olarak, gerekli .NET Core projelerini oluşturalım.

  1. Ürün Servisi (ProductService):

    dotnet new webapi -n ProductService
    
  2. Sipariş Servisi (OrderService):

    dotnet new webapi -n OrderService
    
  3. Ocelot API Gateway (ApiGateway):

    dotnet new webapi -n ApiGateway
    

Adım 2: Ocelot Paketini Kurma

ApiGateway projesine Ocelot paketini kuralım.

dotnet add package Ocelot

Ocelot NuGet Paketi

Adım 3: Ocelot Yapılandırma Dosyasını Oluşturma (ocelot.json)

ApiGateway projesinde ocelot.json adında bir yapılandırma dosyası oluşturalım. Bu dosya, yönlendirme ve yük dengeleme kurallarını tanımlayacaktır.

{
  "Routes": [
    {
      "UpstreamPathTemplate": "/products/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
      "DownstreamPathTemplate": "/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "productservice",
          "Port": 5001
        },
        {
          "Host": "productservice2",
          "Port": 5001
        }
      ],
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      }
    },
    {
      "UpstreamPathTemplate": "/orders/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
      "DownstreamPathTemplate": "/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "orderservice",
          "Port": 5002
        }
      ]
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000"
  }
}
  • Routes: Yönlendirme kurallarını tanımlar.
    • UpstreamPathTemplate: İstemcinin erişeceği URL şablonu.
    • UpstreamHttpMethod: İzin verilen HTTP metotları.
    • DownstreamPathTemplate: Mikroservise yönlendirilecek URL şablonu.
    • DownstreamScheme: Kullanılacak protokol (http veya https).
    • DownstreamHostAndPorts: Mikroservislerin adresleri ve portları. Birden fazla tanımlama olduğunda load balance devreye girer.
    • LoadBalancerOptions: Yük dengeleme seçenekleri.
      • Type: Yük dengeleme algoritması (örn. LeastConnection, RoundRobin).

Adım 4: Ocelot'u Başlatma

Program.cs dosyasında Ocelot'u yapılandıralım.

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

builder.Services.AddOcelot();

var app = builder.Build();

await app.UseOcelot();

app.Run();

Bu kod bloğu şunları yapar:

  1. ocelot.json dosyasını yapılandırmaya ekler.
  2. AddOcelot() metodu ile Ocelot servislerini ekler.
  3. UseOcelot() metodu ile Ocelot middleware'ini pipeline'a ekler.

Adım 5: Mikroservisleri Çalıştırma

ProductService ve OrderService projelerini ayrı portlarda (örneğin, 5001 ve 5002) çalıştıralım. ApiGateway projesini de 5000 portunda çalıştıralım. Yukarıdaki ocelot.json dosyasında ProductService için iki adet instance tanımladık: productservice ve productservice2. Bu iki instance'ı temsil eden iki farklı ProductService projesini farklı portlarda çalıştırmanız (örneğin, 5003 ve 5004) ve hostname'lerini (productservice ve productservice2) host dosyanıza eklemeniz gerekecektir.

Önemli Not: Windows'ta host dosyasını düzenlemek için yönetici ayrıcalıklarına sahip bir metin editörü kullanmanız gerekir. Host dosyası genellikle şu konumdadır: C:\Windows\System32\drivers\etc\hosts.

Host dosyasına şu satırları ekleyin:

127.0.0.1   productservice
127.0.0.1   productservice2

Bu, productservice ve productservice2 hostname'lerinin yerel makineye (127.0.0.1) çözümlenmesini sağlar. Bu sayede Ocelot, ProductService'in farklı instance'larına erişebilir. Şimdi ProductService projelerinizden birini 5003 portunda, diğerini ise 5004 portunda çalıştırabilirsiniz. ocelot.json dosyasında ise ProductService instance'larının portlarını 5001 olarak tutmaya devam edebilirsiniz. Bu, Ocelot'un, ProductService instance'larına aynı port üzerinden eriştiği yanılgısını yaratır, ancak aslında trafik farklı portlarda çalışan instance'lara yönlendirilir.

Adım 6: Test Etme

Şimdi tarayıcınızda http://localhost:5000/products/123 adresine giderek ProductService'e erişmeyi deneyebilirsiniz. Ocelot, isteği ProductService'e yönlendirecek ve yanıtı size geri gönderecektir. Eğer birden fazla ProductService instance'ı çalışıyorsa (örneğin 5003 ve 5004 portlarında), Ocelot yük dengeleme algoritmasına göre istekleri bu instance'lar arasında dağıtacaktır. Aynı şekilde http://localhost:5000/orders/456 adresine giderek OrderService'e erişebilirsiniz.

Load Balance Algoritmaları

Ocelot, farklı yük dengeleme algoritmalarını destekler. LoadBalancerOptions bölümünde Type özelliğini değiştirerek farklı algoritmaları kullanabilirsiniz.

  • LeastConnection: En az bağlantısı olan sunucuya isteği yönlendirir.
  • RoundRobin: İstekleri sunucular arasında sırayla dağıtır.
  • NoLoadBalance: Yük dengeleme yapmaz, ilk sunucuya tüm istekleri gönderir.

Sonuç

Bu makalede, .NET Core mikroservis projelerinde Ocelot kullanarak yük dengeleme uygulamasının temel adımlarını inceledik. Ocelot, mikroservis mimarisinde API Gateway olarak kullanıldığında birçok avantaj sağlar ve uygulamanın ölçeklenebilirliğini ve performansını artırır. Farklı yük dengeleme algoritmalarını kullanarak uygulamanızın ihtiyaçlarına en uygun çözümü bulabilirsiniz.

All rights reserved.