.net core 3.1 Microservices Ocelot Api Gateway Kullanımı Örnek Uygulama

  1. ikidirhem
    9
    252
    28.07.2020 14:36:00

    microservislerim için ocelot api gateway kullanmak istiyorum, ancak .net core 3.1 de çalıştıramadım, videolardaki gibi yaptım fakat olmadı, elinde örnek uygulama olan var mı ?

    ocelot microservices .net-core 3 ay önce 561 Görüntüleme

( 3 ) Cevap

  1. koraydrk
    8
    2699
    28.07.2020 15:55:00

    Merhaba,

    İstersen adım adım, Ocelot ile API Gateway yazalım. Diğer kişilerede faydamız dokunsun.

    Özellikle .net core 3.1 istemişsin, sorun değil, şu an son sürüm .net core 3.1 var zaten, onunla yazacağız.

    Aslında ne için kullanacaksın belirtmemişsin ama, Ocelot un bir sürü kullanım amacı var. Configuration, Authorisation, Caching, Tracing, Routing hatta Load Balancing, GraphQL, Kubernetes gibi alanlar için desteği de var.

    Ben bu örnekte Routing işleminin nasıl yapıldığından bahsedeceğim.

    Mikroservis mimarisine kısaca değinecek olursak, birbirinden bağımsız bir sürü minik servisler barındırır. Bir projenizde belki 10 yada 20 tane servisiniz olabilir. Servis sayısı arttıkça, servisleri yönetmekde zorlaşacaktır. İşte bir zaman sonra bu servisleri tek bir noktadan yönetmek istediğinizde bir API Gateway e ihtiyacınız oluyor ve burada Ocelot bu işimizi görüyor.

    Şimdi şöyle bir örnek yapalım, iki tane API mız olsun, bu API lar hangi porttan çalışırsa çalışsın, biz sadece tek bir port ve tek bir URL adresi üzerinden, diğer iki API dan istediğimize erişelim. İşte Ocelot ile Routing işleminin özeti bu aslında.

    1) Şimdi önce OcelotDotNetCoreExample adında bir solution açıyorum ve altına 3 tane .net core web api ekliyorum

    1. -
    2. CustomerManagementApi
    3. MarketingManagementApi
    4. OcelotApiGateway
    5. -

    2) CustomerManagementApi projemizde şu işlemleri yapıyoruz:

    a) Properties -> launchSettings.json

    "applicationUrl": "http://localhost:9001"
    

    b) Customer adında bir Controller ekleyip, basit bir Get metodu yazıyoruz

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Mvc;
    
    namespace CustomerManagementApi.Controllers
    {
        [ApiController]
        [Route("api/[controller]")]
        public class CustomerController : Controller
        {
            //firmaları getir
            [HttpGet]
            public IEnumerable<string> Get()
            {
                return new string[] { "FirmaA", "FirmaB", "FirmaC", "FirmaD", "FirmaE", };
            }
        }
    }
    

    3) MarketingManagementApi projemizde şu işlemleri yapıyoruz:

    a) Properties -> launchSettings.json

    "applicationUrl": "http://localhost:9002"
    

    b) MarketingExpert adında bir Controller ekleyip, basit bir Get metodu yazıyoruz

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Mvc;
    
    namespace MarketingManagementApi.Controllers
    {
        [ApiController]
        [Route("api/[controller]")]
        public class MarketingExpertController : Controller
        {
            //pazarlama uzmlanlarını getir
            [HttpGet]
            public IEnumerable<string> Get()
            {
                return new string[] { "Uzman1", "Uzman2", "Uzman3", "Uzman4", "Uzman5", };
            }
        }
    }
    

    4) Evet buraya kadar iki tane API yı hazırladık ve çalışacağı portları hazırladık. API mızın birisi 9001 de diğeri 9002 de çalışacak. Ancak bu servisleri kullanacak olan yazılımların hiç bu portları ve bu API lerin url sini bilmesine gerek yok. Bu veriler tek bir noktada toplanacak ve kullanılacak, orasıda API Gateway yani biz şöyle adlandırdık OcelotApiGateway, şimdi onu yazalım.

    a) Properties -> launchSettings.json

    "applicationUrl": "http://localhost:9000"
    

    b) Manage Nuget Packages

    ocelot routing dotnet core example

    c) OcelotApiGateway projemize bir tane ocelot.json dosyası ekleyip, içini şu şekilde yazıyoruz. Routing ayarlarını burda yapıyoruz, tek bir yerden yönetmek için.

      {
      "Routes": [
        {
          "DownstreamPathTemplate": "/api/customer",
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "localhost",
              "Port": 9001
            }
          ],
          "UpstreamPathTemplate": "/musteri-servisi/musteriler"
          //,"UpstreamHttpMethod": [ "GET" ]
        },
        {
          "DownstreamPathTemplate": "/api/marketingexpert",
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "localhost",
              "Port": 9002
            }
          ],
          "UpstreamPathTemplate": "/pazarlama-servisi/pazarlama-uzmanlari"
          //,"UpstreamHttpMethod": [ "GET" ]
        }
      ],
      "GlobalConfiguration": {
        "BaseUrl": "http://localhost:9000"
      }
    } 
    

    d) Program.cs yi şu şekilde kodluyoruz:

    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    
    namespace OcelotApiGateway
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateWebHostBuilder(args).Build().Run();
            }
    
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((host, config) =>
                {
                    config.AddJsonFile("ocelot.json");
                })
            .UseStartup<Startup>();
    
        }
    }
    

    e) Startup.cs de ise kodumuz şu şekilde olacak:

    ConfigureServices metoduna services.AddOcelot(Configuration); ekliyoruz.

    Configure metodunu ise async yapıp, await app.UseOcelot(); ekliyoruz, gün sonunda şöyle olacak orası da:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Ocelot.DependencyInjection;
    using Ocelot.Middleware;
    
    namespace OcelotApiGateway
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
               services.AddControllers();
               services.AddOcelot(Configuration);
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public async void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseHttpsRedirection();
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
    
                await app.UseOcelot();
            }
        }
    }
    
  2. koraydrk
    0
    2699
    28.07.2020 16:39:00

    5) Evet, iki API mız ve onların önlerindeki API Gateway imiz hazır, şimdi test edelim.

    9000 portu üzerinden, yani sadece API Gateway portu üzerinden müşterilerimi çağırıyorum:

    http://localhost:9000/musteri-servisi/musteriler

    ocelot routing dotnet core postman

    9000 portu üzerinden, yani sadece API Gateway portu üzerinden pazarlama uzmanlarını listeliyorum:

    http://localhost:9000/pazarlama-servisi/pazarlama-uzmanlari

    ocelot routing dotnet core postman

    Gördüğümüz üzere, ilerde 20 tane de servisim olsa, tek bir noktadan yönetebiliyor olacağım. 20 servisinde aynı anda portu değişse, metotların ismi değişse vb... beni etkileyen bir şey olmayacak. Tabi API Gateway de gereki ayarlamaları yapacaksınız ama tek bir noktadan, daha yönetilebilir bir şekilde.

  3. koraydrk
    0
    2699
    28.07.2020 17:02:00

    Proje kodlarına github üzerinden erişebilir, projeyi indirebilirsiniz.

    https://github.com/replyfeed/Ocelot-.Net-Core-3.1-Example

Cevabınız