Pars.Core

Mehmet Utku Tatlıdede
LCW Digital
Published in
4 min readApr 21, 2022

Modernizasyon çalışmalarımız ile ilgili başlangıç niteliğindeki ilk yazımda anlattığım tüm çalışma çok basit bir ihtiyaçtan doğdu. İhtiyacı tanımlayan “Sabah ofise geldim ve yeni bir uygulama yazmam istendi. Nereden başlayacağım?” sorusu idi. Özünde hangi teknolojileri kullanacağım, proje yapım nasıl olacak, konfigurasyonu nasıl yönetecegim, monitoring için ne yapacağım gibi bir çok cross-cutting ihtiyaç ve NFRı adreslememiz gereken bir soru silsilsilesi bizleri bekliyordu. Kurum içindeki tüm uygulamaları dönüştürmeyi hedefledigimiz ve onlarca uygulama yüzlerce yazılım geliştiriciye bir sorun anında hızlıca destek olabilmek için tüm projelerde belli bir standart olması mimari ekip olarak bizlerin işini de kolaylaştıracağını değerlendirdik. Diğer taraftan yazılım geliştiren arkadaşlarımızında katkısını almak istediğimizden Pars.Core ilk gününden itibaren LCWaikiki deki tüm yazılım geliştiriciler için open source yazılım kültürüne uygun şekilde şirket içine açıldı. Proje wikisi ile hem özellikleri hem de nasıl geliştirim yapılacağı sürekli güncel tutuldu.

Yukarıdaki sorulardan bazıları için yapılan çalışmaları kısaca aktarmak gerekir ise

Configuration

Pars.Core konfigurasyonlarını kolay yönetebilmek için HashiCorp Consul ve HashiCorp Vault kullanılmakta. Konfigürasyon yönetimi consul ve/veya Vault a erişerek proje konfigurasyonlarını ortam değişkeni (environment variable) olarak inject ediyor. Kubernetes deki config ve secretları mumkun oldugu kadar kullanmayıp merkezi sekilde yönetmemizi sağlıyor.

Authentication

Lcwaikiki de kendi openid providerimiz olduğu için bununla ilgili entegrasyonların kolay yapılması için kullanılıyor. Ayrıca Api Key tabanlı authentication’ı da destekleyebilmek için kendi yazdığımız Api Key uygulamamıza entegre olan yapılarımız bu paketin aldında.

Monitoring

Tüm apilerimiz için metric, ping ve healthcheck end pointlerimizin implement edilmesini sağladık. Bu sayede apilerin grafanada takibini ve alertlerin oluşturulmasını sağlamış olduk. aynı zamanda open telemetry entegrasyonu ile Jaeger kullanabiliyoruz. Async loglama meknanizmamız ile http status ve durationların elastic search üzerinde loglama altyapısıda kurduk. Dashboardlar uzerinden hızlıca takibi uygulama ve end pointlerin takibini sağlıyoruz.

Exception Handling

Rest apilerin geliştirim standarlarında işlemler sonrasında dönülmesi gerkeen http response codeları bulunmaktatır. Özellikle hata durumlarında farklı kodlar ile dönüş yapılması uygulmanın takibi açısından çok önemli. Uygulamanın fırlattığı Exceptionlar ile Http response codeları eşleştirdiğimiz ve Pars.Core ile geliştirilen uygulamalarda exceptionları standart hale getirtir. Örnegin bakiye yetersiz gibi bir durumu 50x lu bir kod ile dönmek izleme ekiplerini hatalı olarak alarma geçirebilir. Bu gibi durumları 422 UnprocessableEntity olarak ele aldık. Böylece gerçek sistem hataları ile yetki hatları ve business hatlarını ayırarak hataları daha doğru yönetimini sağladık. Ek olarak hataların ilgili culture a göre localize edilme ihtiyacı da bu kapsamda ele alınıyor.

Data Persistence

Microservis mimarilerinde her servisin olabildiğince bir birinden bağımsız olabilmesi için datastorelarının da birbirinden ayrı olması gerekiyor. DDD ile data store kapsamına karar vermemiz gerekli. Her servisin ihtiyacı da bir birinden farklı olabildiği için bir çok veri tabanı ile çalışıyoruz. MS Sql, Mongo, Couchbase, Elastic Search ve PostGre en yogun kullandıklarımız. Bu datastorelar ile ilgili kullanımı kolaylaştıran bir çok yapıyı zaman içerinde Pars.Core a kazandırdık.

Caching

Caching performans istediğimiz apilerde olmazsa olmaz. Caching altında Redis ve inmemory olarak iki ayrı implementasyonu olan cache kütüphanemiz bulunuyor.

Messaging

Async olarak işletmemiz gereken bir çok işimiz oluyor. Domainlerde oluşan eventler (sipariş alındı, sipariş teslim edildi, ürün görüntülendi etc)ya da belli bir sıraya sokup tekrar tekrar denenemiz gereken (email sms atma, statu sorgulama) işlemler için mesajlaşma kullanıyoruz. ilk başladığımızda henuz Kafka kurmamış olduğumuz için önce rabbit mq ile sonra da kafka ile entegrasyon katmanı geliştirdik. sonrasında Inbox ve Outbox pattern implementasyonlarını da hem sql hem mongo için implement ettik. Bir çok ekibimizin event kullanırken hızlanmasını sağlamış olduk.

Saga

Microservis dünyası karmaşıklaştıkça distributed transactionlar bir noktada devreye giriyor. Bu ihtiyacında bir çok ekip tarafından paylaşılacağını bekledigimiz için Pars.Core içinde yönetimi kolaylaştıracak bir implementasyon ekledik.

Buraya kadar aktardıklarımın dışında farklı özellikler de ekledi ve eklenmeye devam ediyor. Servis geliştirecek arkadaşlarımız için Pars.Core nasıl kullanıldığını göstermek için örneklerin yer aldığı bir Template Api projesi geliştirdik. Bu template i de nuget olarak dağıtıyoruz. Bu sayede yeni bir api projesine başlarken örnek bir api projesine ve Pars.Core a sahip olmanızı sağlıyor olduk.

dotnet new pars.template --name "Pars.CS.Test" --appname test --servicename test.service

Bu şekilde distribute ediyor olmamız geliştiricilere gercek kolaylık sağlıyor. Pars.Core da nuget ile guncellendiginden hem yeni eklenen featureları almak hem de bugfixleri almak sadece bir nuget update işlemine kalıyor.

Pars.Core 2021 ortalarından itibaren çok yoğun request alan eticaret servislerimiz de kullanılmaya başlandı. Yük altında gördüğümüz tüm iyileşmeleri Pars.Core a da yasıttık. Bu sayede intranette kullanıdığımız bir servisin bile yüksek yük altında perform edeceğinden süphemiz yok.

Son olarak neden adı Pars.Core dersek LCWaikiki de daha .net framework için de bir servis delivery framework çalışması yapılmış ve yerli linux distribution olan Pardus tan da etkinelerek Pars olarak isimlendirilmiş. Bizlerde nasıl .net core gelince .net core olarak anılmaya başladı ise pars.core olarak ilerlemek istedik.

Bu makalede özetlenen çalışamalara onlarca arkadaşımızın katkısı oldu. bu zamana kadar içlerinden biri yazar diye beklediğim bu yazıyı “Pars.Core artık Kazakistan’da” makalesini yakın zamanda yazmayı planladığım için yazdım. Emeği geçen tüm arkadaşlarımın tekrar eline sağlık.

--

--