Ocelot - .Net Core Tarafında Bir API Gateway Denemesi

Uzun süre önce bankada çalışırken nereye baksam servis görüyordum. Bir süre sonra ana bankacılık uygulaması dahil pek çok ürünün kullandığı bu sayısız servisler ağının yönetimi zorlaşmaya başladı. Bir takım ortak işlerin daha kolay ve etkili yönetilmesi gerekiyordu. Müşterek bir kullanıcı doğrulama ve yetkilendirme kontrolü(authentication & authorization), yük dengesi dağıtımı (load balancing), birkaç servis talebinin birleştirilmesi ve hatta birkaç servis verisinin birleştirilerek döndürülmesi(aggregation), servis verisinin örneğin XML'den JSON gibi farklı formata evrilmesi, servis geliş gidişlerinin loglanması, yönlendirmeler yapılması(routing), performans için önbellek kullanılması(caching), servis hareketliliklerini izlenmesi(tracing), servislerin kolayca keşfedilmesi(discovery), çağrı sayılarına sınırlandırma getirilmesi, bir takım güvenlik politikalarının entegre edilmesi, özelleştirilmiş delegeler yazılması(custom handler/middleware), tüm uygulamalar için ortak bir servis geçiş kanalının konuşlandırılması ve benzerleri. Yazarken yoruldum, daha ne olsun :D Sonunda Java tabanlı WSO2 isimli bir API Gateway kullanılmasına karar verildi... [Daha fazla]

.Net Core Tarafından RabbitMQ'ya Mesaj Göndermek ve Java Tarafından Dinlemek

Çok sık karşılaştığımız senaryolardan birisidir; Bir uygulama kendi bünyesinde gerçekleşen bir olay sonrası başka bir uygulamayı haberdar etmek ister ya da başka bir uygulamanın yaptıklarından haberdar olmak isteyen bir uygulama vardır :) Bunun bir çok sebebi olabilir. Örneğin uygulamalar farklı teknolojilerde yazılmıştır ancak ortak iş süreçleri üzerinde koşmaktadır. Gerçek bir senaryo üzerinden hareket edersek konu daha anlaşılır olabilir. Kargo çıkışı gerçekleştiren yeni nesil bir uygulama bu çıkışlar için düzenlediği irsaliyelerin bir devlet kurumuna gönderilmesi sırasında yine aynı kurumun legacy diyebileceğimiz başka bir sisteminin süreçlerine dahil olmak durumunda olsun. Bu sürecin belli noktalarında uygulamaların birbirini haberdar etmesi gerektiğini de varsayalım. Tipik olarak gerçekleşen bir olay sonrası bu olaya ait diğer uygulamanın ihtiyacı olan bilgilerin gönderilmesi bekleniyor. Çok doğal olarak bu iletişimi senkronize etmek çok mantıklı olmaz. Nitekim anlık iş yükü çok yüksek sayılara çıkabilir ve bekleme süreleri diğer uygulamanın sürecini olumsuz etkileyebilir. Asenkron kuyruk sistemi bu dar boğazı aşmada önemli bir rol oynamaktadır. [Daha fazla]

.Net Core Web Api Tarafında SqlKata ile Sevimli SQL İşlemleri

Veri odaklı uygulamalarda sorgu komutlarını çalıştırmak için kullandığımız birçok hazır altyapı var. Örneğin .Net dünyasına baktığımızda en temel seviyede Ado.Net ve Object Releational Mapping tarafında Entity Framework sıklıkla karşılaştıklarımız arasında. SqlKata'da bunlardan birisi olarak düşünülebilir. Bir süredir de sağda solda okuduğum makale ve github çalışmalarından dolayı merak edip kurcalamak istediğim bir kütüphaneydi. C# ile geliştirimiş paketin temel amacı SqlServer, PostgreSql, Firebird, MySql gibi veritabanları için kod tarafında ortak bir sorgu oluşturma/derleme arabirimi sunmak ama bunu LINQ sorgu metotları üzerinden SQL dilinin anlaşılır rahatlığında, injection yemeden(Parameter Binding tekniğini kullandığı için) ve cache gibi performans artırıcıları kullanarak sağlamak... [Daha fazla]

Microsoft ML.Net Kullanarak Basit Bir Öneri Tahminleme Uygulaması Geliştirmek

Yaz başından beri Mark J. Price'ın, C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development: Build applications with C#, .NET Core, Entity Framework Core, ASP.NET Core, and ML.NET using Visual Studio Code, 4th Edition(Evet biraz uzun bir ismi var :D ) kitabıyla uğraştım. Hoş ben daha kitabı tamamlayamadan .Net 5.0 son sürümü çıktı ve hatta Mark bu sürüm için de yeni bir kitap yayınladı ya neyse :D Kitabın ilgimi çeken bölümlerinden birisi(19ncu Kısım) makine öğrenmesi ile alakalı olandı. Makine Öğrenmesi benim çok ama gerçekten çok uzak olduğum bir konu. Yine de "Algoritması benden, modeli senin için eğitirim ve basitçe kullanırsın" diyen Microsoft'un ML.Net çatısını bir kod parçasında nasıl uygulayacağımı da merak etmekteydim. En iyisi kitabın dediklerini uygulamalı olarak yapmaktı. O zaman gelin bir parça kod bir parça ML.Net bir parça MVC yazalım. [Daha fazla]

Yine Yeni Yeniden ELK(Bu sefer E ve K için docker-compose işin içinde)

Her ne kadar artık .Net 5.0 hayatımızın içinde olsa da bu yıl içinde bir yerlerde .Net Core 3.1 ile ELK kurgusunu yeniden değerlendirme ihtiyacı hissetmişim. Elasticsearch, Logstash ve Kibana kurgusu aslında günümüz uygulamalarında son derece popüler. Genellikle uygulama loglarının devasa şekilde biriktiği durumların çözümünde ideal bir kurgu. Uygulama loglarını standart bir formata uygun olacak şekilde Elasticsearch'e atar ve bizler de Kibana gibi arayüzleri kullanarak burayı monitör ederek çeşitli durumların kontrolünü yapmaya çalışırız. Ağırlıklı olarak üretim ortamında oluşacak hataların, dar boğazların yakalanması noktasında işimize yarayan bir düzenek olarak düşünebiliriz. Şunu da belirtmekte yarar var. Günümüz uygulamalarında hataları debug ederek bulmak yerine detaylı ve iyi bir strateji ile oluşturulmuş logları takip ederek tedbir almak son derece kıymetlidir. Benim bu çalışmadaki amacım .Net Core 3.1 üstünden ELK düzeneğini kurgulayıp loglama, izleme işlerini tekrarlamaktı. Ancak bu sefer ElasticSearch ve Kibana containerları için docker compose aracını kullanmayı da öğrenmek istemiştim. Yani çalışmanın ana noktası ilgili düzeneği Docker Compose ile kurgulamak. [Daha fazla]

Bir Web API Hizmetinde Talepler ile CQ Arasında Mediator Kullanmak

CQRS, nam-ı diğer Command Query Responsibility Segregation mimari deseni, veritabanına doğru yapılan yazma, güncelleme, silme gibi aksiyonlar ile veri çekme işlemlerini ayrıştırmayı önermektedir. Command tarafı ile ilişkilendirilen aksiyonlar sadece veri üzerinde işlem yapar ve geriye bir şey döndürmezler. Sorgulama(Query) tarafına ayrılan aksiyonlar da tam tersine sadece veri döndürmekten sorumludurlar(Listeleme veya tek bir öğe detayının döndürülmesi gibi) Bir Web API ve CQRS söz konusu olduğunda karşımıza birde Mediator tasarım kalıbının uygulanışı çıkar. [Daha fazla]

Basit Bir .Net Core Worker Servisi(Linux Daemon Olarak)

.Net Core Worker Service'ler ile planlanmış görevlerin arka planda icra edilmesi mümkün. Mesela belirli aralıklarla sistemden veri toplayıp kullanan bir Windows Service bu şekilde geliştirilebilir. Lakin o zaman .Net Core kullanmanın bir esprisi kalmıyor öyle değil mi? :) Bunun yerine bir Linux servisi geliştirmeyi ne dersiniz? En azından nasıl geliştirilebileceğini öğrenmeye. İşte benim amacım Heimdall(Ubuntu-20.04) üzerinde Linux Daemon olarak çalışacak bir servis yazmak. Örneğin günlük hava durumu bilgilerini 24 saatte bir toplayıp Redis üzerinde saklayan bir servis pekala güzel ve eğlenceli olabilir(Belki de olmaz, neyse) Daha önceki örneklerde kullandığımız Redis Docker Container'ı burada da kullanabiliriz. Öyleyse ne duruyoruz. Haydi kodlamaya. [Daha fazla]

Eğlenceli Sayılabilecek bir SignalR Uygulaması

Turşunun iyisi limonla mı olur yoksa sirkeyle mi? Neşeli Günler'i izleyenleriniz rahmetli Münir Özkul ve Adile Naşit arasındaki atışmayı gayet iyi bilir :) Arada bir eski de olsa her yönüyle bizlere tarifsiz dersler veren yapımlarımızı izlemek gerekiyor. Tabii yine de turşunun iyisi limonla mı olur yoksa sirkeyle mi olur pek bilemiyorum. İyisi mi bunu bir SignalR servisine bırakalım. Ne dersiniz? Birkaç kez .Net Core'un farklı versiyonları ile SignalR uygulaması yazmaya çalışmıştım. Tazelenme sürecindeki skynet'te ona yer vermezsem olmazdı. Bu sefer biraz daha eğlenceli olsun istedim. Amacım siteye bağlanan kullanıcıların oy vermek suretiyle iyi turşunun limonla mı yoksa sirkeyle mi yapılacağına karar vermelerini sağlamak :D Yarışma gibi olan oylamada birden fazla kullanıcı bağlanınca sonuçları anlık olarak progress bar'lar üzerinde de görünsün istiyorum. En azından klasik chat uygulamasından farklı olacak bir antrenmana başlıyoruz diyebilirim. [Daha fazla]

Şu Docker-Compose Dedikleri

Aslında birden fazla Container söz konusu olduğunda bunların yönetimi için kullanılan araçlardan birisi Docker-Compose. Senaryoda farklı dillerde yazılmış üç servisi kullanmak istiyorum. Birisi .Net Core ile yazılmış Web Api, diğeri Flask kullanan Python ve sonuncusu da Express bazlı NodeJs uygulaması. Servislerin ne iş yaptığı çok önemli değil. Odaklanmamız gereken nokta Dockerfile içerikleri ile docker-compose.yml üstünde Container kompozisyonunun nasıl tasarlandığı olacak. Buradaki servislere birde veritabanı bağımlılığı eklemeyi denemek gerçek hayat senaryolarını tatbik etmek adına iyi olabilir. Örneğin Nodejs uygulamasının Postgresql kullanacak şekilde dockerize edilmesi ve Postgresql için docker-compose'da bir imajın kullanılacağının ifade edilmesi iyi bir pratik olacaktır. Üstelik bu tip bir kurgu eğer eğitmenseniz de çok işinize yarayacaktır. Biz şimdi işimize geri dönelim. [Daha fazla]

Web API Tarafında Dapper Kullanımı

Veri kaynakları ile kod tarafındaki modeller arasında devreye giren bir çok ORM aracı mevcut. Stackoverflow tarafından geliştirilen ve Micro ORM olarak nitelendirilen Dapper bunlardan birisi. SQLite, MySQL, SQLCE, SQL Server, Firebird ve daha bir çok veritabanı platformu ile çalışabilen Dapper'ın performans olarak da iyi sonuçlar verdiği ifade edilmekte. Amacım Dapper'ı bir Web API uygulamasında SQLite ile birlikte kullanabilmek. [Daha fazla]

Sunucu Bazlı Blazor Uygulaması ve Firestore Kullanımı

Blazor client-side web framework olarak düşünülebilir(Component ve DOM etkileşiminin aynı process içerisinde gerçekleşmesi) ancak process'lerin ayrılması konusunda da esnektir. Öyle ki, Blazor'u bir Web Worker içinde çalıştırıp UI thread'inden ayrıştırılabileceği ifade edilmektedir. Diğer yandan 0.5 sürümü ile birlikte Blazor uygulamalarının sunucu tarafında çalıştırılması mümkün hale gelmiştir. Yani .Net Core ile etkileşimde olacak şekilde Blazor bileşenlerini(component) sunucu tarafında çalıştırabiliriz. Burada .Net tarafı WebAssembly yerine CoreCLR üzerinde koşar ve .NET ekosisteminin tüm nimetlerinden(JIT, debugging vb) yararlanabilir. UI tarafı ile etkileşimde olayların ele alınması ve Javascript Interop çağrıları için SignalR bağlantılarından faydalanılır. [Daha fazla]

Blazor ile Hello World Uygulaması Geliştirmek

Amacım Microsoft'un deneysel olarak geliştirdiği Blazor çatısı (Web Framework) ile C#/Razor (Razor HTML markup ve C#'ın bir arada kullanılabildiği syntax olara düşünülebilir. Bu sayede C# ve HTML kodlamasını aynı dosyada intellisense desteği ile ele alabiliriz) ,HTML ve WebAssembly tabanlı web uygulamalarının nasıl geliştirilebileceğini Hello World diyerek deneyimlemek. [Daha fazla]

Kimdir Bu Travis?

Continuous Integration kaliteli ve sorunsuz kod çıkartmanın önemli safhalarından birisi. DevOps kültürü için değerli olan, Continuous Deployment/Delivery ile bir anılan CI'ın uygulanmasında en temel noktalar kodun sürekli test edilebilir olması ve ne kadarının kontrol altına alındığının bilinmesi. Başarılı bir Build için bu kriterlerin metrik olarak gerekli değerlerin üzerine çıkması şart. Ancak bu metriklere uyan bir Build, dağıtıma gönderilebilir bir aday sürüm haline gelebilir. [Daha fazla]

EF Core : Testlerde InMemory Context Kullanımı

Entity Framework ile çalışırken test süreçlerini zorlaştırabilecek bağımlılıklardan birisi de uzak veritabanı bağlantısıdır. Genellikle bir SQL sunucusu ile çalışıldığından connectionString bilgisinde belirtilen adrese test ortamında da gidilebiliyor olması beklenir. Ancak bu şu anki durumda şart değil. EF context'ini bellekte çalışacak şekilde o anki process içerisinde de kullanabiliriz. Bunun için... [Daha fazla]

Code Coverage

Bu yazımızda .Net Core tarafında geliştireceğimiz kod parçaları için Code Coverage değerlerine nasıl bakabileceğimizi inceleme çalışıyoruz. Bunu yaparken Coverlet kütüphanesi ve SonarQube'ün docker üzerinde çalıştıracağımız versiyonundan yararlanıyoruz. Sonarscanner aracını da işin içerisine katarak test değerlerini SonarQube'e göndermeyi deniyoruz. [Daha fazla]

Daha Verimli Konfigürasyon Yönetimi (.Net Core)

.Net core'da konfigurasyon bilgileri varsayılan olarak json formatlı olarak tutulur(appsettings.json) Burada çalışma zamanına özgü varsayılan parametreler dışında özel konfigurasyon içeriklerini tutmak da mümkündür. Hatta istersek birden fazla konfigurasyon dosyasını da bir arada kullanabiliriz. Her ikisini uygulamak da oldukça kolay aslında. Nasıl mı? Gelin birlikte bakalım. [Daha fazla]

Electron ile Cross-Platform Uygulama Geliştirmek

Haftasonu kendimi bir şekilde ilginç bir maceranın içerisinde buldum. West-World'de Windows Forms benzeri bir uygulama yazabileceğimi ve bunu hem macos hem de windows platformunda yapabileceğimi öğrendim. Bunun için HTML, Node.js ve CSS yeterli. İşin aslı electron isimli açık kaynak geliştirilen ürün sayesinde platform bağımsız masaüstü uygulamaları geliştirmek mümkünmüş. Hızlı bir deneyim için interneti taramaya ve basit bir "Hello World" yazmaya karar verdim. Amacım West-World(Ubuntu) üzerinde geliştireceğim masaüstü uygulamasını hem macox hem de windows üzerinde çalıştırabilmekti... [Daha fazla]

Visual Studio Code İçinde Unit Test Yazmak

Bu yazımızda Visual Studio Code içerisinde Unit Test barındıran bir çözümün nasıl geliştirilebileceğini inceliyoruz. İdeal klasör yapısını oluşturuyor, MSTest çatısını kullanarak çok basit bir test vakasını işletmeye çalışıyoruz. Amaçlarımızdan birisi de Visual Studio Code arabirimi dışına çıkmadan proje iskeletini oluşturmak ve testleri kurgulayarak deneyimlemek. [Daha fazla]

Bir Web API Servisi Nasıl Hata Döndürmeli ?

Bu yazımızda IETF(Internet Engineering Task Force) ekibinin koyduğu önemli standartlardan birisi olan "Problem Details for HTTP APIs" konusunu incelemeye çalışıyoruz. Bu bağlamda RFC 7807 maddesinde belirtilen sonuçları elde edebilmek için Kristian Hellang'in geliştirdiği Hellang.Middleware.ProblemDetails nuget paketinden yararlanıyoruz. [Daha fazla]

Docker SQL Server Kullanımı

West-World'e daha önceden Microsoft SQL Server sürümünü kurmuş ve basit denemeler yapmıştık. Esasında bu şart değildi. SQL Server'ın Linux platformu için olan Docker imajını da kullanabilirdik. İşte bu yazımızda docker imajını baz alarak, Entity Framework çatısının kullanan basit bir Web API servisini nasıl geliştirebileceğimizi öğrenmeye çalışacağız. [Daha fazla]

Eğlenceli SignalR

Bu yazımızda, Chart.js kütüphanesini kullanarak, tarayıcı üzerindeki bir grafiğin SignalR üzerinden nasıl beslenebileceğini incelemeye çalışıyoruz. Bunu yaparken Chart.js'in nefis özelliklerini kullacağız ama daha da önemlisi verilerin belirli periyotlarla istemci tarafına akmasını ve grafik üzerinden anlık(SignalR kullanmamızın bir sebebidir) olarak izlenebilmesini sağlayacağız. [Daha fazla]

Basit Bir JsonConverter Uyarlaması

Elimizde aynı anlamları taşıyan ama key adları farklı olan JSON içerikleri bulunmakta. Farklı paketleri kullanan servislerden dönen farklı cevaplar oluşuyor. İstemci tarafı aynı anlamdaki bu farklı çıktılar için farklı sınıflar tasarlamak istemiyor. Acaba ters serileştirme işlemi sırasında araya girip farklı key değerlerini aynı nesne örneğinin özelliklerine atamamız mümkün olabilir mi? JsonConverter sınıfını kullanarak konuya çözüm üretmeye çalışıyoruz. [Daha fazla]