.Net Core Püf Noktaları-Dikkat Edilmesi Gerekenler
Merhabalar,
.Net Core 27 Haziran 2016'da hayatımıza girdiğinden beri bir çok yazılım geliştirici tarafından üzerinde denemeler, performans testleri ve projeler geliştirme için kullanıldı. Bunların bazıları faydalı bulundu ve üzerine çok büyük projeler geliştirildi. Öyle ki, Java’dan, C#’dan veya diğer programlama dillerinden “bu .net core çok iyi olmuş” diyerek .Net Core dünyasına gelenler de oldu. Belirli tasarım kalıpları .Net Core ile kullanıldı. DDD, Microservice vs..
.Net Core kullanırken Dependency Injection yöntemi temele alınmış ve üzerine ActionFilter, RequestFilter, Middleware gibi kavramlar da DI üzerine geliştilerek kullanıma sunulmuştu ki benim en sevdiğim kavramlar bunlar. Küçük projeler geliştirilirken veya küçük testler yapılıyorken bazı tasarım kalıplarının kullanımından özellikle uzak duruldu. Mesela Mikroservis mimarisi küçük projelerde ekstra zahmet demek çünkü bakım maliyeti yüksek ve karmaşıklık yaratmak açısından bayağı başarılı. Dolayısı ile orta ve büyük ölçekli projelerde bazı özellikler kullanıldı veya bazı tasarım kalıpları üzerinde çalışılmaya başlandı.
Sadece tasarım kalıpları ile de sınırlamamak lazım aşağıda bir kaç tanesini sayacağım bir çok konu var .Net Core üzerinde kolayca uygulanabilen ve bizi çok büyük miktarda zahmetten kurtaran bazı özellikler var.
Ortama Bağlı Ayarlar — Configurations
Ortama bağlı ayarları biraz açmak gerekirse, Test-Geliştirme-Üretim ortamlarınızın olduğunu düşünün. Ayarlar dosyasında veritabanına bağlanmak için sunucunuzun IP’sinin veya kullanıcı adı ve şifre gibi değerlerin olduğunu düşünün. Development ortamındaki ayarlar ile Üretim ortamındaki ayarlar farklı farklı ise Dev ortamına deploy ettikten sonra Üretim ortamına deploy yapacağınız zaman bu dosya içerisindeki ayarları değiştirmeniz gerekecektir. Ancak çoklu ayar dosyaları oluşturarak her ortam için ayrı ayrı ayarlarınızı belirleyebilir ve deploy yaparken hiç bir ayar değiştirmeden hayatınıza devam edebilirsiniz.
İstek Doğrulama — Request Validation
Eğer bir Web Api geliştiriyorsanız projenize dışarıdan bir çok istek gelecektir. Veri gönderen veya veri alan bir sürü Api’niz olabilir. Size gönderilen verilerin kontrolünü sağlamak, istediğini formata veya doğruluğa sahip olup olmadığınu kontrol etmek gereken bir sürü durum yaşanacak. Örneğin Student isminde bir class gönderiliyor ve siz bunu veritabanına kayıt edeceksiniz. Ancak bu Student objesindeki Name alanının dolu olduğundan emin olmak istiyorsunuz ve fonksiyonunuz içinde kontrol ederek eğer dolu değilse hata fırlatabilirsiniz. Peki bu class 100 tane metoda parametre olarak geliyorsa 100 tane kontrol mü koymak gerekecek? Tabi ki hayır, .Net Core mucizelerinden bir tanesi ile bu işi yapabilirsiniz. Request Validation burada hayat kurtaracak rolü üstleniyor. “Bunun bir örneği yok mu kardeşim” diyorsanız yazının en altında paylaşacağım link üzerindne detaylı bilgi alabileceksiniz.
Model Dönüşümleri — Model Mapping
“Domain Driven Design” tasarımından yola çıkarak projenizde kullanmış olduğunuz katmanları birbirinden ayırmak gerekecektir. Veritabanındaki tablolarınıza karşılık gelen modelleriniz ayrı bir proje içinde olacak, ancak Rest Api üzerinden geriye döneceğiniz modeller ayrı olmalı. (En alttaki linkte bunun da sebebini anlattım). İşte bu iki model arasında çok büyük oranda benzerlikler olacağı için dönüşümleri sırasında da bir tool kullanmak gerekecektir. AutoMapper bu iş için biçilmiş kaftan. Eğer bu dönüşümleri elle yaparsanız modellerinizin veya modellerinizin kullanıldığı metodlarınızın sayısı arttığında başınız fena halde ağrıyacak demektir.
Cevap Ön Bellekleme — Response Caching
Türkiye’deki illerin listesini dönen bir servisiniz olduğunu düşünün. Bu servis çağrıldığında Data katmanınızdaki modellerinizi doldurmak için veritabanına gittiniz ve modeller arası dönüşümü de sağladıktan sonra dışarıya bir liste verdiniz. Ardından aynı servise bir istek daha geldi ve siz yine veritabanına gittiniz aynı listeyi aldınız model dönüşümü yaptınız ve dışarıya verdiniz. Bunu iki kez yazmış olmamın sebebi aslında tıpa tıp aynı işlemlerin iki kez yapılmasıdır ve işin kötüsü geriye dönen illerin listesi de aynı olacaktır(yeni bir il Türkiye’ye eklenmediği sürece)
Dolayısı ile her istekte veritabanına gidip veriyi alıp üzerinde işlemler yaparak hem veritabanı hem de kendi projeniz üzerinde yük yaratmaya gerek olmadığı durumlar olacaktır(il listesi örneği gibi).
.Net Core ile gayet başarılı bir şekilde kullanılan Response Caching sizin için aynı servise aynı parametreler ile gelen isteklerden bir tanesini sizin belirtmiş olduğunuz süre kadar ön bellekte tutarak, o süre bitene kadar gelen tüm isteklere artık veritabanından değil ön bellekten cevap verecektir. Dolayısı ile hem uygulama üzerinde hem de veritabanı üzerindeki yükten kurtulmuş olacaksınız.
Uygulama Sağlık Durumu — Healtcheck
Bir çok servisin ayrı ayrı çalıştığı yapılarda, örneğin mikroservis, her uygulamanın işini yapması son derece önemlidir. Çünkü uygulamaların bir tanesinin bile çalışmaması tüm sistemin çalışmamasına sebep olabilir (doğru tasarım ile bunun da önüne geçilebilir). Bu yüzdendir ki uygulamalarınızın sağlıklı bir şekilde çalıştığından emin olmak için sürekli olarak durumlarını kontrol etmek gerekecektir. Zabbix Agent, haProxy gibi uygulamalar hem uygulama hem de sunucu hakkında bilgi vererek sonuçların izlenmesi işlemlerini kontrol etmek için kullanılabilirler. sunucuadi:port/health gibi bir adrese istekte bulunan birine “OK” gibi bir cevap verebilirseniz ve bunu da uygulamanıza istek gönderen monitor uygulamasında ayarlarsanız eğer bu uygulama sizin projenizin sağlıklı bir şekilde çalıştığından emin olacaktır. MVC kullanılan yapılarda .Net Core içerisinde health isminde bir controller yaratarak bu adresi kolayca sağlayabilirsiniz. Ancak burada bazı maliyetlere katlanmak gerekecektir. Controller yaratıldığında ve bu istek doğrudan buraya geldiğinde, ActionFilter, Middleware, RequestHandler, Logging gibi mekanizmalar devreye girerek kendi işlerini yapacaklardır. O yüzdendir ki burada controller yaratmaktan daha verimli çözümler var. .Net Core size bu konuda yardımcı olarak HealtCheck işlemlerini de yönetebilmenizi sağlıyor.
Burada bahsettiğim konuların detaylarını ve bunlar gibi diğer püf noktalarını da bulabileceğiniz bir youtube kanalım var ve bu kanala ve videolara buradan ulaşabilirsiniz.