20 Kasım 2022 Pazar

Dapr ile Bağımsız Servisler


    S.A. Arkadaşlar,

    Bugün yine Microsoft tarafından geliştirilmiş açık kaynaklı bir projeden bahsedeceğiz: Dapr. Bildiğiniz üzere mikroservis tarafında uygulama geliştirmenin avantajları olduğu gibi zorlukları da var. Bu zorlukları azaltmak adına birçok araç bulunmaktadır. Dapr da bunlardan biridir. State managment, input/output binding, publish & sucsribe, distributed lock, service invocation gibi birçok şeyi desteklemektedir. Bunları yaparken de varsayılan ayarlarla gelmesine rağmen, hiç bir araca bağımlı kalmıyor(pluggable) ve istenildiği takdirde bunları çok hızlı bir şekilde değiştirebiliyorsunuz. Size kalan ise işinize odaklanmak...

    


    Microsoft, uzun süre bu ürünü üzerinde çalışıp test etti ve nihayetinde canlıya da aldı. Popüler programlama dillerinin birçoğu da desteklemektedir. Bu dilleri var olan SDK'ları ile kullanabilirsiniz. Hatırlarsanız bir önceki yazımızda "tye project"ten bahsederken hem diğer dillerde eksiklik olduğundan bahsetmiştik hem de hala canlıya çıkmadığından bahsetmiştik, Dapr ise bu iki olayı da çözmüş ve github üzerinden de görebileceğiniz gibi hala ciddi şekilde geliştirilmeye devam etmektedir. CNCF (Cloud Native Computing Foundation) projesi olarak geçtiğini ve "community" tarafından da desteklenip güvenildiğini söylemekte fayda var.

    Dapr'dan bahsederken "sidecar pattern"dan da bahsetmek lazım ki arkasında çalışan mantığı daha iyi kavrayalım. Farklı diller için her işi yazmak yerine (örneğin log mekanizmasını hem .net hem go ile yazmak yerine) tek bir dil ile bunu yapıyoruz ve lazım olan servislerimize dahil edebiliyoruz. Dapr da bu temel amaç etrafında işini yapmaktadır. Bunu ise hazır API'ler sunarak yapıyor. Proje bu API'leri kullanarak yapıyı daha kolay yönetebilir hale getiriyor.

    Dapr'ın varsayılan olarak kullandığı araçlar olduğunu söylemiştik. State store için "Redis", observarbility için "Zipkin" kullanır. Ayrıca varsayılan olaran bir komponent klasörü oluşturur. Bu dosya sayesinde yazılım tarafına dokunmadan araçları istediğimiz şekilde değiştirebiliyoruz. Burada iyi bir soyutlama ile "loosely coupled" olarak geliştirme yapılmış, bize düşen ise konfigürasyon dosyasını düzenlemektir. Bu dosyanın formatına ve genel kapsamına şuradan bakabilirsiniz.


    Bu kadar bahsettikten sonra sanırım kurulum kısmına geçebiliriz. Kurulumu oldukça kolaydır. Buradan gerekli adımları takip edebilir ya da kurulum dosyasını indirip kurabilirsiniz. Kurulum tamamlandıktan sonra "dapr" yazarak yüklenip yüklenmediğini kontrol edebilirsiniz. Sadece bu yetmez ayrıca "init" komutunu da çalıştırmayı unutmayın. Aşağıdaki çıktıda "dapr init" yazmadan ve yazdıktan sonraki hallerini görüyorsunuz.

    
    Docker cli ile "docker ps" yazarak veya herhangi bir UI aracı kullanıyorsanız aşağıdaki gibi bir çıktı da görmeniz gerekir.

    Kod örneklerini 2 repo üzerinden göstereceğiz. İlki ABP framework'ü ile yazılmış, buna alışık olanlar için daha sade bir proje yer almaktadır. Diğeri ise mikroservis projesindeki implementasyonu mevcuttur.

    Yapacağımız şey bir event fırlatmak ve onu başka bir serviste yakalamak olacaktır. Bu örnekte kod parçalarını paylaşmak yerine bağlantılarını paylaşıp geçeceğiz. Event fırlattığımız örnek bir console uygulamamız var, event'i fıraltan sınıfımız, onu tüketen sınıfımız, komponent dosyamız ve projeyi ayağa kaldıracağımız tye dosyamız. Projeyi indirdikten ana dizinde "tye run" demeniz yeterli olacaktır. Tye ile ilgili kurulumlar eksik ise buradaki yazıma bakabilirsiniz. http://localhost:8000/ adresine gittiğinizde böyle bir sayfa ile karşılaşmanız lazım. Logs altında loglara bakarak atılan ve yakalanan event'leri görebilirsiniz.


    Şimdi ise microservis projesinde nasıl kullandığımızı daha geniş bir şekilde ele alacağız. Öncelikle event'i gönderen yere odaklanacağız, daha sonra onu tüketen yere odaklanacağız, son olarak da yapılan ayarlamalardan bahsetmeye çalışacağız. Buradaki örneğimiz pub&sub ile ilgilidir, fakat diğer özellikler de kullanılabilir. Örnek olması açısından 1.ci örneğimiz ile aynı mantığa sahip olacaktır. 
//Tüm sınıfı görmek için tıklayınız
PersonDto personDto = new()
{
   Id = person.Id
};
await _daprClient.PublishEventAsync("pubsub", "PersonDeleted", personDto);
//_daprClient DI ile içeri alıyoruz.
return Ok(person.Id);

//Startup dosyasına aşağıdaki kodu eklemek gerekir. Daha fazlası için
services.AddDaprClient(); 
//Tüm sınıfı görmek için tıklayınız
[Topic("pubsub", "PersonDeleted")]
[HttpPost("PersonDeleted")]
public ActionResult AddProduct(PersonDto personDto)
{
   Console.WriteLine($"Deleted Person Id: {personDto.Id}");
   return Ok();
}

//Startup dosyasına ise;
services.AddControllers().AddDapr();

app.UseCloudEvents();
app.UseEndpoints(endpoints =>
{
    endpoints.MapSubscribeHandler();
});
#Yaml dosyasına gitmek için tıklayınız
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6973
  - name: redisPassword
    value: ""
#Son olarak tye ile ayağa kaldırmak için eklenen ayarlar.
#Tüm yaml dosyasına gitmek için tıklayınız
extensions:
- name: dapr
  components-path: "./"
  services:
    telephonedirectory-guide:
      http-port: 7002
      grpc-port: 7003
    telephonedirectory-report:
      http-port: 8002
      grpc-port: 8003
      enabled: true
    Kod tarafının iyice uzamaması adına sadece eklenen yerleri kopyalama çalıştık, dosyaların linkerini de ayrıca ekledik, projenin tümünü zaten yukarıda vermiştik. Tüm ayarlamalar bittiyse ana dizinde "tye run" yapmak yeterli olacaktır. 

    Sözlerimizi bir hadis-i şerif ile noktalayalım.
Yüce Allah, yaptığınız işi sağlam ve iyi yapmanızdan hoşnut olur. Beyhâkî, Şu’abu’l-Îmân, 4/334.

Kaynakça

Hiç yorum yok:

Yorum Gönder