.Net Core

Microservice Architecture

Post Page Advertisement [Top]

      Merhaba,
      Bu yazımızda .Net Core ile yazılmış bir API' a Dağıtık Önbellek(Distributed Cache) çözümü sunan Couchbase' i ekleyeceğiz.



     Öncelikle neden dağıtık önbellek ihtiyacımız var ? Bundan bahsedelim: Bir kaç API' mız olduğunu düşünelim ve her bir API metodlarında il bilgisine ihtiyaç duysun. İl bilgilerini veritabanından almak yerine performansı sağlamak için Cache (Önbellek)'de tutmamız gerekir. Bildiğiniz üzere cache verileri RAM'de tutulur.

Okurken ne dinlemeli ?


 Peki API'lar il listesini cache'den alırsa, her bir API için gereksiz yere il listesi tekrarlı olarak RAM'de tutulmuş olacak.

     Öyleyse Cache datasının tutulduğu bir server olmalı ve API'ler bu server ile haberleşip buradan istediği veriyi almalı. Böylece önbellekte tutulacak veriyi çoğullamamış oluruz.

     Dağıtık önbellek imakanı sunan tool'lara baktığımızda Redis oldukça popüler fakat Redis'in Windows'a desteğini kesmesinden dolayı bugün sizlere hem Linux hem de Windows' a destek veren Enterprise ve Community Edition seçenekleri olan Couchbase' den bahsedeceğim.

     Öncelikle Microservis mimarisinde rahatça kullanabileceğimiz ve bir gereklilik olduğunu da eklemek isterim sıkça kullanılan ve zamanla değişmeyen datalarınızı mutlaka cache'de tutumanızı performans için tavsiye ederim. Performanslı API'lerin en önemli özelliklerinden biri caching'dir.

    İlk olarak Couchbase 'nin sever kurulumunu yapalım: Bunun için aşağıdaki adresten Communtiy Edition ve Windows seçeneklerini seçelim.

https://www.couchbase.com/downloads




Kurulumu tamamladıktan sonra sunucumuzda 8091,8092,11210 portlarına Firewall Settings' den Inbound Rule ekleyerek izin verelim.

Couchbase dashboardına aşağıdaki linkten erişelim ve öncelikle bir cluster ve bucket ekleyelim.

http://localhost:8091/ui/index.html#!/overview




        Bucket eklerken RAM kullanım miktarına sınır belirleyebiliriz. Couchbase No-SQL bir veritabanı olduğu için biz sadece cache'leme yapmak için Bucket türünü Ephemeral seçiyoruz.



Şimdi de bucket'e erişim yetkisi olan bir kullanıcı ekleyelim.


 Distributed Cache Server' ımızı kurduk. Şimdi API tarafında kodlamamızı yapaılım. İlk olarak Couchbase nuget paketini projemize ekleyelim.

Install-Package Couchbase.Extensions.Caching



.Net Core Rest API oluşturduktan sonra ilk olarak appsettings.json dosyasına server url, bucketname gibi bilgileri tutmak için aşağıdaki gibi bir alan ekleyelim:


  "Couchbase": {
    "Server": "http://yourserverIP:8091",
    "Username": "locationcacheuser",
    "Password": "yourpassword",
    "BucketName": "locationcache",
    "UseSsl": false

  }

Sonra Startup.cs'de Couchbase'yi ilklendirelim :


       public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.AddSingleton<ILocationRepository, LocationRepository>();

            services.AddCouchbase(opt =>
            {
                opt.Servers = new List<Uri>
                    {
                        new Uri(Configuration.GetSection("Couchbase").GetValue<string>("Server"))
                    };
                opt.Username = Configuration.GetSection("Couchbase").GetValue<string>("Username");
                opt.Password = Configuration.GetSection("Couchbase").GetValue<string>("Password");
            });

            services.AddDistributedCouchbaseCache(Configuration.GetSection("Couchbase").GetValue<string>("BucketName"), opt => { });
        }



           Görüldüğü gibi username , password server gibi kolay değişebilir olsun diye appsettings'den alıyoruz. İlgili kodu yazdıktan sonra gerisi oldukça basit Redis ve Couchbase IDistributedCache interface'sini kullanıyor. Aşağıda Controller'da Couchbase Cache'yi nasıl kullandığımızı görelim:

    [ApiController]
    public class LocationController : ControllerBase
    {
        private readonly IDistributedCache _distributedCache;
        private readonly ILocationRepository  _locationRepository;

        public LocationController(IDistributedCache distributedCache, ILocationRepository locationRepository)
        {
            _distributedCache = distributedCache;
            _locationRepository = locationRepository;
        }

      
        [Route("getcities")]
        [HttpGet]
        public async Task<List<GetCitiesResponse>> GetCities()
        {

            List<GetCitiesResponse> response = new List<GetCitiesResponse>();
            string key = "Couchbase_Cities";

            try
            {
                string result = System.Text.Encoding.UTF8.GetString(_distributedCache.Get(key));
                response = JsonConvert.DeserializeObject<List<GetCitiesResponse>>(result);
            }
            catch (Exception)
            {
                //If key not awailable in Reids , Get error description from DB and set.
                var item = await _locationRepository.GetCities();

                if (item != null)
                {
                    _distributedCache.Set(key, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(item)),
                                    new DistributedCacheEntryOptions
                                    {
                                        AbsoluteExpiration = DateTime.Now.AddYears(1)
                                    });

                }
                response = item.ToList();
            }
            return response;

        }


         İlk olarak il listesini cache'den çağırıyoruz eğer veri varsa çekiyoruz yoksa cache'ye set ediyoruz. Projeyi çalıştırıp API'yi ayağa kaldırdıktan sonra getcities metodunu çağırdığımızda Coucbase'de item count'un arttığını dashboard'ınden görebilriz. Yani bir nesne daha Cache'de tutulıuyor demek. Ayrıca ilk çağrıma kıyasla metodun ikinci çağrımlarının çok daha hızlı cevap veridğini görebilirisiniz.



Yukarıdaki ekran görüntüsünde Items count: 2 , bu cache'de iki item olduğunu anlatıyor. Mor ile altı çizili olan Statistics sayfasına gittiğinizde ise Cache'de tutulan Top Key'leri görebilirsiniz.

Ephermeral bir veri yapısı olduğu için maalesef Query ile sorgu çekemiyoruz.



Makale'nin koduna github'ımdan ulaşabilirsiniz işe yarar bulduysanız yıldız vermeyi unutmayın.

Sağlıkla Kalın.

Hiç yorum yok:

Yorum Gönderme

Bottom Ad [Post Page]