.Net Core Microsevice Api Gateway - Ocelot

Engin Karabudak
XTribe
Published in
4 min readMar 8, 2021

Merhalar, yine bir süre uzak kaldıktan sonra bu defa sizlerle mikroservis yaklaşımı, mikroservislerdeki api gateway yapısı ve bunu sağlayan yararlı bir open source Ocelot kütüphanesinden bahsedeceğim.

Mikroservis Nedir ?

Mikroservis yaklaşımını basitçe açıklamak gerekirse bir projeyi tek bir parça halinde geliştirmek yerine bunu küçük küçük ve birbirinden bağımsız çalışan parçalara bölerek projeyi geliştirme yaklaşımınıdır.

Monolithic vs Microservice

Yukarıdaki resimden de görüldüğü üzere bir yazılım projesinde istekler artıkça projeye yeni yetkinlikler ekleriz bu sebeple de projede ki kodlar gittikçe artmaya başlar sol taraftaki yapıda görüldüğü gibi çember büyüdükçe büyür. Hal böyle oluncada projeye eklentiler yapmak, yeni yetkinlikler eklemek ve oluşan problemleri çözmek bir hayli zor bir durum olmaya başlar. Biz bu yapılara monolitik yapılar diyoruz. Az önce saymış olduğum sorunlarla karşılaşmamak için bu tek düze monolitik yapıdan çıkılıp birbirinden bağımsız çalışan soyutlanmış ama birbirleriylede sürekli iletişim halinde olan parçalara bölünmüş yapılarla mikroservis mimarisi yaklaşımı ortaya çıkmıştır. Her biri ayrı bir varlık olan mikroservisler birbirinden bağımsız olarak değiştirilebilir ve ayrı ayrı deploy ve relase işlemleri yapılabilir.

Api Gateway Nedir?

Yukarıda bahsetmiş olduğum mikroservis mimarisiyle birlikte monolitik uygulamarın yerini birbirleriyle konuşan birden çok bağımsız servis yapılarına bırakmasıyla sistemin ufak parçalara bölünmesi beraberinde farklı konularıda ortaya çıkardı.

İlk olarak bu mikro servisler birbirleriyle nasıl haberleşecek, bu servislerin authorizationının ve authenticationu nasıl yapılacak, bu servislerin loglama işlemleri, monitoring işlemleri ve ortak configurasyonların nasıl olacak, gelen isteklerin nasıl karşılanacağına kadar birçok düşünmemiz gereken konu var ve tüm bunlarda api gateway’in çıkış noktası. Yani Api Gateway ‘in temel görevi clientten isteği alıp belirli işlemlerden geçirip ilgili mikroservislere iletmesidir.

Api Gateway’in Yetenekleri;

  • Authentication — Authorization
  • Logging
  • Response Caching
  • Routing
  • Configuration

Ocelot

Ocelot, mikroservis mimarisi için tasarlanmış açık kaynak .NET Core tabanlı bir Api Gateway’dir. Microservisler, servis odaklı mimarilerde veya dağıtık sistemlerde gelen requestleri istenen api servislerine yönlendirmeye ve geriye response olarak döndürmeye yarar. Ocelot’un projemize nasıl entegre edildiğine routing işleminin nasıl yapıldığına beraber bakalım.

Öncelikle bir e-ticaret sitemizin olduğunu düşünelim ve product,customer, identity ve gatewaye api mikroservislerimizin olduğunu varsayalım.

Microservices
-ProductApi
-CustomerApi
-IdentityApi
-ApiGateway

Yukarıdaki yazdıklarım gibi 4 tane .net core web api projesi oluşturalım.

ProductApi;

[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase{
public IActionResult Get(){
return Ok(new List<string> { "Notebook", "Camera", "Mause", "Headphone" });
}
}

CustomerApi;

[ApiController]
[Route("api/[controller]")]
public class CustomerController : ControllerBase{
public IActionResult Get(){
return Ok(new List<string> { "Customer1", "Customer2", "Customer3" });
}
}

IdentityApi;

[ApiController]
[Route("api/[controller]")]
public class IdentityController : ControllerBase{
public IActionResult Login([FromBody] model){
if(ModelState.IsValid){
.
.
return Ok(new {
token= new JwtSecurityTokenHandler().WriteToken(token),
expiration=token.ValidTo });
}
}

Ve apilerimize erişim token alabileceğimiz basit bir Identity Api oluşturdum.Sonrasında her bir projenin lokalde hangi portlar üzerinden çalışacağının tanımı yapalım. İster Program.cs içerisinden gerekli configurasyonu yapın isterseniz ‘launchSettings.json’ dosyasındaki profilleri kullanabilirsiniz. Ben Program.cs üzerinden bu configurasyonu yaptım.

ProductApi Configurasyon

Yukarıdaki görüntüde ProductApi için 7002 portundan ayağa kalkacak şekilde configurasyonumu yaptım, aynı şekilde customer api içinde 7003 portu tanımlaması yapacağım IdentityApi de 7004 portundan hizmet verecek.

Şekilde görüldüğü gibi Api Gateway önce Identity servise gidip token alacak ve daha sonra diğer gerekli servislere istek atacak. Apilerimizi oluşturduk sıra geldi Api Gateway tarafında bu işlemler nasıl yapılacak ona bakalım.

1- İlk olarak Api Gateway web api projemizi oluşturuyoruz.

2-Daha sonra ister nuget package managerdan istersekte Install-Package Ocelot komutu ile Ocelot kütüphanesini projemize kuruyoruz.

3-Api Gateway projemizin içine ocelot.json dosyası oluşturarak routing işlemi yapacağımız configurasonları tanımlıyoruz.

{
"ReRoutes": [{
"DownstreamPathTemplate": "/api/products",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [{
"Host": "localhost",
"Port": 7002
}],
"UpstreamPathTemplate": "/product-api/products",
"UpstreamHttpMethod": [ "Get" ],
"AuthenticationOptions": {
"AuthenticationProviderKey": "IdentityApiKey",
"AllowedScopes": []
}
},
{
"DownstreamPathTemplate": "/api/customers",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [{
"Host": "localhost",
"Port": 7003
}],
"UpstreamPathTemplate": "/customer-api/customers",
"UpstreamHttpMethod": [ "Get" ]
},
{
"DownstreamPathTemplate": "/identity-api/identity",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [{
"Host": "localhost",
"Port": 7004
}],
"UpstreamPathTemplate": "/identity-api/identity",
"UpstreamHttpMethod": [ "Get" ]
}],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:7000"
}
}

Gördüğünüz gibi, Routes bölümü yalnızca üç düğüm içerir Routes dizisi içinde tanımladığımız her bir eleman bir servisi ifade ediyor. Ayrıca ‘ProductAPI’ route’una özel bir ‘AuthenticationOptions’ tanımlandığını göreceğiz. Bu şu anlama geliyor ilgili route’a bir authentication konfigürasyonu sağlamaktadır. ‘AuthenticationProviderKey’ alanı ile hangi şema üzerinden kimlik doğrulama işlemi yapılacağı bildirilmektedir.

Yapılandırma, API ağ geçidi aracılığıyla yalnızca

http: // localhost: 7002/ api / product

http: // localhost: 7003/ api / customer

http: // localhost: 7004/ api / identity

erişebileceğimiz anlamına gelir.

Ayrıca GlobalConfiguration bölümünde BaseUrl düğümünü de yapılandırıyoruz. Bu kısımda api gateway uygulamamızı host ettiğimiz url ve portu tanımlıyoruz.

DownstreamPathTemplate alanına ilgili apinin hangi porttan ya da urlden hizmet verdiğini yazıyoruz.

UpstreamPathTemplate ‘de ise hangi path’i yazdığımızda bizi bu apiye yönlendireği kısmı tanımlıyoruz.

4- Api Gateway projemiz Program.cs sınıfı içierisinde oluşturmuş olduğumuz ocelot.json entegre ediyoruz.

5-Yine startup.cs içinde bulunan ConfigureService methodu içine service.AddOcelot(Configuration) ve Configure metodu içerisinede app.UseOcelot() tanımlaması yaparak işlemlerimizi tamamlıyoruz.

Uygulamalarımız belirtilen portlarda çalışacaktır. Örnek request yapalım. Tüm servislere 7000 portu üzerinden erişebiliyoruz.

http://localhost:7000/product-api/product

Umarım yararlı olmuştur. Sonraki yazılarda görüşmek üzere, sağlıcakla kalın.

Engin Karabudak

--

--