.Net Core Api Gateway Ocelot Kullanımı: API Yönlendirme ve Yönetimi

Samet UCA
4 min readFeb 13, 2024

--

Referans: Implementing API Gateways with Ocelot — .NET | Microsoft Learn

Günümüzün yazılım geliştirme dünyasında, mikro servis mimarisi giderek daha popüler hale geliyor. Ancak, birden fazla mikro servisi yönetmek ve bunlar arasında istekleri yönlendirmek karmaşık bir süreç olabilir. İşte burada, C# geliştiricilerinin imdadına yetişen bir araç olan Ocelot devreye giriyor. Bu makalede, Ocelot’un ne olduğunu, nasıl kullanıldığını ve neden önemli olduğunu öğreneceksiniz.

Ocelot Nedir?

Ocelot, .NET ekosisteminde API ağ geçidi işlevselliği sağlamak için kullanılan bir kütüphanedir. Basitçe söylemek gerekirse, Ocelot gelen istekleri alır, bunları işler ve ardından belirli mikro servislere yönlendirir. Bu, birden fazla mikro servis kullanıldığında, istekleri yönetmeyi ve dağıtmayı kolaylaştırır.

Neden Ocelot Kullanmalıyız?

  1. API Yönlendirme ve Yönetimi: Ocelot, gelen istekleri yönlendirmek ve farklı mikro servisler arasında trafiği dağıtmak için kullanılabilir. Bu, karmaşık mikro servis mimarilerini daha kolay yönetilebilir hale getirir.
  2. Filtreleme ve Düzenleme: Ocelot, gelen istekleri filtreleyebilir ve düzenleyebilir. Örneğin, istekleri kimlik doğrulama veya yetkilendirme için kontrol edebilir ve isteği değiştirebilir.
  3. Yük Dengeleme: Ocelot, gelen istekleri belirli mikro servisler arasında yük dengelemesi yaparak dağıtabilir. Bu, servislerin daha verimli ve dengeli bir şekilde çalışmasını sağlar.

Nerede Kullanabilirim?

  1. Mikro Servis Yönetimi: Bir e-ticaret uygulaması düşünün. Bu uygulama, kullanıcıların alışveriş yapmasını sağlayan bir arayüze ve stok yönetimini sağlayan bir mikro servise sahip olabilir. Ocelot, kullanıcıların gelen isteklerini doğru mikro servise yönlendirerek bu işlemi kolaylaştırır.
  2. Kimlik Doğrulama ve Yetkilendirme: Bir sosyal medya uygulaması için Ocelot, kullanıcıların giriş yaparken kimlik doğrulamasını ve yetkilendirme işlemlerini yönetebilir. Böylece, kullanıcılar doğru bir şekilde yetkilendirilmeden önce istekleri işleyebilir.
  3. API Sürüm Yönetimi: Ocelot, farklı API sürümlerine sahip bir uygulamanın trafiğini yönetebilir. Bu, yeni bir API sürümüne geçiş yaparken mevcut kullanıcıları etkilemeden bu geçişi sağlar.

Örnek olarak visual studio üzerinden 3 farklı proje oluşturalım.

Burada first api ve second api projeleri için gateway kullanacağız.

Öncelikle Gateway olarak kullanılacak projeye gerekli paketi kuralım.

Paket kurulumundan sonra sıra servislerin eklenmesinde.

Program.cs altında gerekli ayarlamaları yapalım. Ayarlarda biraz sonra oluşturacağımız ocelot.json dosyasının gösterilmesi, ocelot servisine konfigurasyonun verilmesi ve alt satırlarda bulunan ocelot kullanma komutu ile işlemi tamamlayacağımızı görebilirsiniz.

public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);


builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Configuration.AddJsonFile($"ocelot.json", false, true);
builder.Services.AddOcelot(builder.Configuration);

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseOcelot().Wait();

app.UseHttpsRedirection();

app.UseAuthorization();


app.MapControllers();

app.Run();
}
}

Controller içerisinde bir metot ekleyelim. Bu metot her çağırdığımızda aslında o apinin çalıştığını bize söylemesi gerekiyor. Bu örnekte yeterli.

    [ApiController]
[Route("api/[controller]")]
public class FirstController : Controller
{

[HttpGet("Get")]

public string Get()
{
return "First Api Work";
}

}

Aynı controller örneğini oluşturulan diğer api projesi içinde uygulayabilirsiniz.

    [ApiController]
[Route("api/[controller]")]
public class SecondController : Controller
{

[HttpGet("Get")]
public string Get()
{
return "Second Api Work";
}
}

Şimdi Ocelot için en önemli adım olan konfigurasyon dosyasını oluşturup düzenlemeye geldik.

Bu dosya içerisinde gerekli tüm yönlendirmeleri ve sınırlandırmaları yapabiliriz.

Gateway projesinin hemen altına ocelot.json adlı bir dosya oluşturun.

{
"Routes": [
{
"DownstreamPathTemplate": "/api/first/get",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 7079
}
],
"UpstreamPathTemplate": "/services/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:7015"
}
}

Burada incelememiz gereken noktalar şöyle;

DownstreamPathTemplate

Gelen istekler hangi adrese yönlendirilecek?

DownstreamScheme

Gelen isteklerden hangi protokol kabul edilecek?

DownstreamHostAndPorts

Yönlendirdiğimiz projenin host ve port bilgileri. Burada ben gelen isteği birinci api adresime yönlendireceğim için onun bilgilerini verdim.

Kafa karıştırıcı bir tarafıda dosyanın sanki tersten yazılmış gibi olması. İlk bakışta bana biraz tuhaf gelsede anlaşılması kolay.

Dolasıyla ilk konfigurasyonlar aslında nereye yönlendireceğimiz üzerine yapılıyor. Bir sonraki adımda ise hangi istekleri yönlendireceğiz şeklinde.

UpstreamPathTemplate

Burada artık hangi istekleri yönlendireceğimizi konfigure etmeye başlıyoruz. Ben ”/services/{everything}”, şeklinde giriş yaptım. Bu şu demek oluyor: https://localhost:port/services/herhangibirsey yazdığımda bu adres beni otomatik olarak yukarıda konfigure ettiğimiz api adresine yönlendirecek.

UpstreamHttpMethod

Hangi istek tiplerini kabul edeceğimizi belirtiyoruz.

BaseUrl

Gateway projemizin host ve port bilgisi.

Şimdi projelerimizi multiple olarak ayağa kaldırarak postman üzerinden test edelim.

Görüldüğü üzere konfigurasyon dosyasında belirttiğimiz gibi gelen her isteği ilk apimize yönlendirdik. Şimdi ikinci apimiz içinde yönlendirme işlemi yapabiliriz. Bunun için tekrar json dosyasına dönüp gerekli alanları yazıyoruz.

{
"Routes": [
{
"DownstreamPathTemplate": "/api/first/get",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 7079
}
],
"UpstreamPathTemplate": "/services/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]
},
{
"DownstreamPathTemplate": "/api/second/get",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 7080
}
],
"UpstreamPathTemplate": "/services-second/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:7015"
}
}

Görüldüğü üzere Routes objesinin içerisine yapılan yeni bir tanımlama ile bu işi halledebiliyoruz. Testi bu url üzerinden gerçekleştirirsek ikinci apimizin dönüş yaptığınız görebiliriz.

Ocelotun konfigurasyon dosyası sadece bunlarla sınırlı değil. Bu makalede sadece routing konusunu işlediğimiz için bununla sınırlı bıraktım. Ocelotun başka ne gibi yetenekleri olduğuna resmi web sayfası üzerindeki okunuşu rahat olan dökümanından öğrenebilirsiniz.

Getting Started — Ocelot 22.0 documentation

Projenin kaynak adresi ->

https://github.com/sametuca/NetCoreOcelot

--

--

Samet UCA
Samet UCA

No responses yet