Ocelot – .Net Core API Gateway
Herkese Merhaba, Bugün Microservice mimarisin de işlerin kontrolden çıkmamasını ve performans olarak büyük projelerde inanılmaz yardımlar sağlayan Ocelot‘u ele alacağız.

API Ağ Geçidi nedir?
Bir API Ağ Geçidi temelde bir arayüzdür. API istek almak ve istek göndermek veya gelen isteklere göre sorgular yaparak cevap dönen bir uygulama olarak düşünebiliriz.
Ocelot nedir?
Ocelot, .Net Platformu için bir API Ağ Geçidi’dir. Ocelot’un birincil işlevi, gelen HTTP isteklerini almak ve bunları mikroservislere ileterek onlardan cevap alıp isteği yapan diğer bir servise güvenli bir şekilde iletmektir. . İşte Ocelot’un resmi sayfası https://ocelot.readthedocs.io/
Ocelot çok güçlü bir Kütüphanedir. işte Ocelot özelliklerinden Bazıları
- yönlendirme
- WebSockets
- kimlik doğrulama
- yetki
- Hız Sınırlama
- Önbelleğe almak
- Yeniden Deneme Politikası/QoS
- Yük dengeleme
- Kayıt/İzleme/Korelasyon vb. Daha fazla özellik listesi için resmi web sitesini ziyaret edebilirsiniz..
Aşağıdaki örnekte Ocelot microservice mimarisi örneğini inceleyebilirsiniz

Bildiğiniz gibi Microservice mimarisinde genelde bir çok API olur ve her bir API’nin kendi sorumluluk alanları vardır. Bazen o kadar çok oluyor ki bunların birbirlerine olan bağlantılarını takip etmek, güvenliğini sağlamak ve fake veya gereksiz isteklerin api leri yormaması için önlemler almak için tonlarca kod yazmamız gerekebiliyor. Bu kontrolleri Ocelot ile yapabilir ve uygulama performansını arttırmaya katkı sağlayabilirsiniz. Şimdi Ocelot ile ilgili küçük bir örnek yapalım.
Öncelikle boş bir Visual Studio ‘da blank bir Blank Solution oluşturdum. Bu Solution çerisine 3 adet proje ekleyelim.
- Ocelot için bir .Net 6.0 – Asp.net Core Empty projesi ekliyorum. Projenin Adını Gateway verdim.

Buradaki seçenekler bu şekilde kalabilir. Docker container kullanacaksanız bunun yml dosyasını Visual Studio’nun otomatik oluşturması için işaretleyebilirsiniz.

Projeyi ekledikten sonra aşağıdaki gibi bir dosya yapısı gelecek. Buradan Nuget’i açarak Ocelot Kütüphanesini projemize ekliyoruz. Ocelot’u ekledikten sonra malesef Ocelot ihtiyacı olan config dosyalarını kendisi getirmediği için kendimiz eklemek ve ayarlarımızı yapmak zorundayız.

Öncelikle Gateway uygulamasının açılırken bir ön yüzü olmadığı için web tarayıcısına ihtiyacımız yok. Properties klasörü altındaki launchSettings.json dosyasının içerisinden development’in içerisindeki LaunchBrowser ayarını false yapalım.

Şimdi Ocelot’u servis olarak tanımlamamız gerekiyor. .Net 6.0 versiyonun da startup.cs dosyası kaldırıldı ve artık kullanılmıyor. Tabiki isterseniz ekleyebiliyorsunuz ama konumuz bu olmadığı için bunu burada anlatmayacağım. Şimdi .Net 6.0 için program.cs dosyası içerisinde Ocelot’u tanımlayalım.
ilk olarak gördüğünüz gibi program.cs dosyası içerisinde ocelot için kullanacağımız config dosyası olan ocelot.json dosyasını tanımlıyoruz. daha sonrasında builder.Services.AddOcelot(); satırı ile ocelot servisini kullanacağımızı ve uygulama ayağa kalkarken bunu da çalıştırmasını istiyoruz. son olarak app.UseOcelot().Wait(); kodunu middleware için ekliyoruz.

Şimdi Config dosyasını oluşturmamız gerekiyor. Config içerisinde hangi sorgunun nereye gideceğini Ocelot’a bildirmemiz gerekiyor, kabaca tabir ile şu sorgu geldiğinde bu microservis’e gönder bu sorgu geldiğinde şu microservis’e gönder şeklinde tanımlamalar yapacağız. Projemizin içerisine bir json dosyası ekliyoruz ve ismini config.jon yapıyoruz. Config dosyası içerisine yazacağımız tanımlamaları ocelot’un sitesinden alabilirisiniz. Link’i aşağıya bıraktım 🙂
Getting Started — Ocelot 1.0.0 documentation
Link’e girdiğinizde ocelot’un verdiği örneği kopyalayarak config.json içerisine yapışyırabilirsiniz. Aşağıdaki gibi bir görünüme sahip.

Şimdi ayarlamaları yapmadan önce projemize ismi BookAPI şeklinde bir ASP.NET Core Web API ekleyelim.

Projemizi ekledikten sonra çalıştırdığımız da swagger sayfası bizi karşılıyor. Default olarak hava microsoft örnek bir hava durumu eklemiş. Bunun üzerinden ilerleyebiliriz. Benim bilgisayarımda uygulama localhost:5057 adresinden ayağa kalkıyor. Şimdi postman’dan bir sorgu atıp API’nin çalışıp çalışmadığını kontrol edebiliriz.

Postman’da localhost:5057 şeklinde adresimizi yazdıktan sonra swagger ‘de gördüğünüz gibi kullanabileceğimiz bir link ve GET metodu var. Buradaki gördüğümüz gibi postman da link’i yazıyoruz ve sonrasında WeatherForecast ekleyerek sorguladığımızda aşağıdaki gibi API’nin cevap verdiğini görebilirsiniz.

API’miz çalıştığına göre şimdi Ocelot’a geri dönüp config dosyası içerisinde servisimizin bağlantı bilgilerini verelim. Burada bazı ayarlara dikkat etmemiz gerekiyor.
DownstreamPath şeklinde geçen ayarlar Bizim servisimize ulaşmak için kullandığımız yolu soruyor. Yani postmana girdiğimiz adresi.
DownstreamPathTemplate Yapılan sorgunun API’de hangi adrese gideceğini belirtiyoruz. everythink yazdım şuan. Bunun anlamı gelen tüm sorguları buraya gönderebileceğimizi gösterir. Port ve host’u girdikten sonra
UpstreamPathTemplate Kısmına Ocelot’a bu servis için hangi link’den sorgu atılabileceğini belirtiyoruz. Ben services yazdım. ve link’e services yazılarak başlanırsa DownstreamPath’de belirttiğim servise gidecek.
UpstreamHttpMethod Hangi metodları kabul edeceğimizi yazıyoruz. Bazen sadece bilgi vereceğiniz bir serviste güvenlik nedeni ile GET verilerek ekstra güvenlik sağlanabilir.
UpstreamScheme bölümünde hangi protokol ile isteklerin kabul edileceğini belirtiyoruz.
GlobalConfiguration bizim Gateway’imizin portunu yazıyoruz.
Aşağıdaki tanımlamada benim sorgu atılacak API’min portunu ve ip adresi,dns veya docker container yolunu yazabilirsiniz. ben şimdilik local’de çalıştıracağım için localhost yazdım. {everything} yazdığınızda sorguyu kısıtlamamış oluyorsunuz. yani service/ yazdıktan sonra ekleyecekleri her satırı api’ye sorgulayabileceğimizi söylüyoruz.

Şimdi her iki projeyi çalıştırarak postman’dan sorgu atalım.
Gördüğünüz gibi Postman’da service/WeatherForecast yazdığımızda sorgunun sonucu api’den alarak ocelot bize getirmiş oldu.

Ocelot’un loglarına baktığımızda bizim api’mizden WeatherForecast’dan sorguyu sağlıklı bir şekilde aldığını görüyoruz.
message: 200 (OK) status code, request uri:http://localhost:5057/WeatherForecast

Helal be Allahına kurban abi
Çok güzel post ve kullanışlı örnekler,devamini bekleriz.