2 Aralık 2022 Cuma

REST API

HTTPS Nasıl Çalışır ?


 

- HTTPS olmadan, browser ile server arasındaki iletişim düz metindir.  Bu, girdiğiniz şifrenin veya internet üzerinden gönderdiğiniz kredi kartı numarasının, onu ele geçirme yeteneği olan herkes tarafından okunabileceği anlamına gelir.

- HTTPS, bu sorunu çözmek için internet üzerinden gönderilen verileri gönderici ve alıcı dışında kimse tarafından okunamaz hale getirmek için tasarlanmıştır. 

- HTTPS, HTTP protokolünün bir uzantısıdır.

-HTTPS ile veriler, TLS adı verilen bir şey kullanılarak şifrelenmiş bir biçimde gönderilir. TLS (Transport Layer Security) protokolü aracılığıyla da güvenlik oluşturur. TLS, bu veri aktarımının değişmesi ya da bozulmasını önleme özelliğine sahiptir. 

-Şifrelenmiş veriler bir bilgisayar korsanı tarafından yakalanırsa, tek görebildikleri karmakarışık verilerdir. TLS hand shakenin(el sıkışma) devreye girdiği yer burasıdır.






1 Aralık 2022 Perşembe

Browsera bir URL yazdığımızda ne olur ?

 









1-  Bob tarayıcıya bir URL girer ve enter tuşuna basar. Sonra ne olur ?
- URL, universal resource locator, anlamına gelir ve dört bölümden oluşur. 
- Birincisi Şema Schema http:// . Bu, tarayıcıya HTTP adı verilen bir protokol kullanarak sunucuya bağlanmasını söyler. Diğer bir yaygın şema HTTPS'dir. HTTPS ile bağlantı şifrelenir.
-URL'nin ikinci kısmı bir Domaindir. Yukarıdaki örnekte  example.com sitenin domain ismidir. 
-URL'nin üçüncü kısmı Path dir  ve dördüncü kısmı Resourcedir. Bu ikisi arasındaki fark genellikle çok net değildir: Directory  ve File olarak düşünülebilir.
- Browserin servera  nasıl ulaşacağını bilmesi gerekiyor. Bu örnekte example.com domain ismidir. DNS lookup adı verilen bir işlemle yapılır. (Domain Name System). İnternetin telefon rehberi gibi düşünebiliriz. DNS, alan adlarını IP Adreslerine çevirir, böylece browserlar resourceleri yükleyebilir.





2-Lookup sürecini hızlandırmak için, DNS bilgileri büyük ölçüde önbelleğe alınır. İlk olarak, browserin kendisi kısa bir süre için önbelleğe alır. Ve eğer bu bilgi browserda değilse, işletim sisteminden bunu ister. işletim sistemininde  bunun için bir önbelleği vardır. Bu da cevabı kısa bir süre için tutar.. 




2.1Artık işletim sisteminde yoksa, internetten bir DNS resolvera (DNS çözümleyici) sorgu yapar. Bu, IP Adresi çözümlenene kadar bir request zinciri başlatır. Bu işlemin DNS alt yapısındaki birçok sunucuyu içerdiğini ve yanıtın her adımda önbelleğe alındığını unutmamak gerekir. Şimdi nihayet browserimiz , Serverin IP Adresine sahip.(example.com un IP adresine ulaşılmış oldıu.)




3- Browserimiz elde ettiği  IP Adresini kullanarak server ile TCP bağlantısı kurar. TCP Bağlantısı kurmakla ilgili bir hand shake yapılır. Bu hand shakenin tamamlanması için birkaç ağ gidiş gelişi gerekir. Hızlı loadinge devam etmek için, modern tarayıcılar keep-alive bağlantısı adı verilen bir şey kullanarak sunucuya kurulmuş bir TCP Bağlantısını mümkün olduğu kadar yeniden kullanmayı dener. Unutulmaması gereken bir nokta, eğer protokol HTTPS ise, yeni bir bağlantı kurma süreci daha da karmaşıktır. 
Browser  ve server arasında şifreli bağlantı kurmak için SSL/TLS adı verilen karmaşık bir işlem gerektirir. Hand shake  maliyetlidir ve browserlar , maliyeti düşürmeye çalışmak için SSL Oturumu devam ettirme gibi hileler kullanır.




4 - 5 Son olarak browser, kurulan TCP Bağlantısı üzerinden servera bir HTTP requesti gönderir. HTTP'nin kendisi çok basit bir protokoldür. Server requesti işler ve geriye bir response gönderir.


6- Browsert responsu alır ve html içeriğini render eder. Çoğu zaman javascript paketleri ve images gibi yüklenecek ek resourceler de vardır.




















29 Kasım 2022 Salı

Repository ve UnitOfWork

 DBContext
Veritabanına karşılık gelen obje yapısıdır. İçerisinde tablo yapısına karşılık gelen DbSet objeleri bulundurur. DbContext Kullanarak Tablo ve Viewlara erişebiliriz.

Repository Pattern
-Veri işlem ve sorgulamaların merkezi bir yapıya çekilmesidir. Bu sayede veritabanı işlemlerimizi tekrarlı olarak iş katmanı içinde yazmak durumunda kalmamış olacağız. 
-Buna ek olarak Veri katmanı ve bu katmanı kullanan iş katmanı arasında bir arabirim olarak yer alır ve bu iki katman arasında soyutlama görevini de üstlenmiş olur.

UnitOfWork
-Bu pattern, iş katmanında yapılan her değişikliğin anlık olarak database e yansıması yerine, işlemlerin toplu halde tek bir connection üzerinden gerçekleşmesini sağlar.

-Unit Of Work, toplu veritabanı işlemlerini tek seferde bir kereye mahsus execute eden ve böylece bu toplu işlem neticesinde kaç kayıtın etkilendiğini rapor olarak sunabilen bir tasarım desenidir.


It is a single transaction that involves multiple CRUD operations.

When using Repository Pattern, we access the DBContext in our repositories.

Each repository generates and maintains its instance of DBContext.

This might lead to issues since DbContext has its in-memory list of records for the entities being modified or added in a single transaction.

In such cases, when SaveChanges() fails for a repository and succeeds in the other one, it will result in database inconsistency.

To avoid this, we add a Unit of Work layer that is a centralized store for all the repositories to receive the same instance of DbContext.

UoW ensures that the operations either succeed or fail as a whole.

We omit the Rollback() method in the Unit of Work implementation, leveraging EF Core's behavior that changes persist only when calling SaveChanges().




En soldaki kısım  repository kullanılmadığı durumlarda doğrudan veritabanına DbContext aracılığı ile erişilmesini göstermektedir. Sağdaki kısım ise Unit Of Work pattern kullanılarak katmanlarla ayrılan Entity Framework ve Controller bölümlerinin arasına istenildiği anda gerçek repository değil de  bir mock repository yerleştirme sayesinde test edilebilirliğin kolaylaşması sağlanmaktadır.

Entity Framework ORM(Object Relational Mapping) araçlarından biridir. ORM nedir dersek: İlişkisel veritabanı ile nesneye yönelik programlama(OOP) arasında bir köprü görevi gören araçtır. Bu köprü, ilişkisel veritabanındaki bilgilerimizi yönetmek için nesne modellerimizi kullandığımız bir yapıdır. Kısaca veritabanına bizim nesnelerimizi bağlayan ve bizim için veri alışverişini yapan Microsoft tarafından geliştirilmiş bir framework’tür.

referanslar:

21 Kasım 2022 Pazartesi

Transactional Outbox Pattern


Outbox patterni kullanarak Domain Eventleri nasıl pushlayacağımızı öğreneceğiz. Outbox Pattern transactionumuzun Atomik bir şekilde tamamlanmasını garanti etmek istediğimiz senaryolarda faydalıdır.

Problem

Event Driven Arthitecture, Loose Coupling servisler geliştirmek için kullandığımız yöntemlerden birisidir. Sistemde yapılan değişikliklerin events şeklinde ortak bir platforma, bir Message Brokera , yayımlanıplanıp oradanda  farklı consumerler tarafından handle edilmesi üzerine kuruludur.

örn. X servisindeki bir işlem, Y servisini çağıracağına (http request), yaptığı işlemi message brokera yayımladıktan sonra, bu evente abone olan Y servisi, eventi yakalayıp handle ediyor. Bu sayede bu iki servisin bir birine olan bağımlılığını ortadan kaldırmış oluyoruz.

Yukarıdaki senaryoda X servisi kendi işlerini tamamlayıp daha sonra Y nin kendi işlerini yapması için gerekli olan eventi, message brokera yollayamazsa(message broker servisi ayakta olmayabilir) burada sorun ortaya çıkıyor. Veri bütünlüğü sağlanamamış oluyor.

Çözüm

-İşte tam da bu durumda outbox pattern devreye giriyor ve X servisinin yapacağı işlem ve göndereceği event bir transactional bütünlük içerisinde gerçekleşiyor.
-Eğer event gönderilirken bir sorun ile karşılaşılırsa tüm işlem geri alınıyor. Bu sayede veri bütünlüğü sağlanmış oluyor.
-Ayrıca artık X servisinin eventi yayınlayacağı platforma olan bağımlılığı da ortadan kaldırılmış oluyor. Message Brokerin ayakta olup olmaması artık X servisini ilgilendirmiyor.
-X servisi gerekli veri tabanı işlemlerini tamamladıktan sonra direkt olarak message broker ile iletişime geçmek yerine eventlerin tutulduğu başka bir tabloya kayıt atıyor. Bu şekilde X servisi tüm bu işlemleri transactional bütünlükle yapabiliyor.
-Son olarak da bir message relay(worker service) tabloaya yazılmış olan bu eventleri alıp message brokera yolluyor. Eğer message brokera eventler başarılı bir şekilde gönderilmişse bu tablodaki eventlerin statuleri güncelleniyor.



-Diyelim ki REST Api'mize order requesti geldi. 
-İlk olarak apimiz bu isteği alıp Entity tablosuna yazacak.
-Daha sonra Outbox tablosuna kayıt atacak.
-Publisher, Outbox tablosundaki gönderilmemiş statudeki eventleri çekip bu eventleri Event Bus'a gönderecektir.
-Daha sonra Publisher, Event Bus'a gönderdiği kayıtları Outbox tablosundan silecektir. Tamda bu aşamada bir problem çıkarsa ve publisher event busa kayıtları gönderir fakat outbox tablosundan kayıtları silemezse, publisher servisi aynı kayıtları Event busa tekrar göndermiş olacaktır. Artık event busa aynı kayıt iki kez gönderilmiş olacak ve consumer aynı mesajı iki kez almış olacak. Burada oluşan dublicate kayıt sorununu nasıl çözebiliriz ?

Handling Dublicate Messages(Idempotent Consumer)

Dublicate olan messageleri handle etmek için daha önce process ettiğimizi bir tabloya kaydetmemiz gerekir. Consumer ve messageId değeri bir tabloda tutulmalıdır.

18 Kasım 2022 Cuma

Memento Pattern

Sarmalamayı bozmadan bir nesnenin iç durumunu yakala ve dışarıya çıkar öyleki nesne bu duruma daha sonra dönebilsin.

Problem

-Bazen bir nesnenin durumunu kaydetme ihtiyacı duyulur.
-Özellikle bir nesnenin durumu sıklıkla değişiyor ve zaman zaman bu değişiklikleri geri almak(undo) yada geçmişteki bir noktaya dönmek.(checkpoint)
-söz konusu ise bu ihtiyaç çok daha açık hale gelir.

Çözüm

-Memento bir nesnedir ve durumu saklanacak nesnenin bir andaki(snapshot) durumu için muhafızlık yapar.
-Memento,gerektiğinde durumu değişen nesnenin durumunu sakladığı hale geri getirmek için kullanılır.
-Memento, nesnenin sadece durumu saklanma ihtiyacı duyulan kısmını gereken derinlikte saklar

Template Method Pattern

- Bir algoritmanın ana yapısını, bazı adımlarını alt sınıflara bırakarak bir fonksiyonda tanımla.
- Template Method, Bir algoritmanın yapısını değiştirmeden bazı adımlarının alt sınıflarda tekrar tanımlanmasına imkan sağlar.

Sonuçlar
-Template method ile bir algoritmanın değişken noktaları soyutlanır.
-Template Method kalıbıyla algoritmalar arasındaki ortak noktalar bir üst sınıfta soyutlanır değişen noktalar ise alt sınıflarda yerine getirilir.
-Base classta metodları yaz alt sınıfların override etmesi gereken metotları abstract olarak tanımla. Bu base yani template clası implement eden alt sınıflar bu abstract metotların içini doldursun


Template method kalıbı Strategy kalıbı ile karıştırılabilir.

-Aralarındaki en temel fark Strategy'de tüm algoritma detayını alt sınıflara bırakılmasına karşın Template method'ta algoritmanın iskeleti ve belki bazı adımları belirlenmekte ve diğer bazı adımları alt sınıflara bırakılmaktadır.
-Strategy'de algoritma belli değildir. Template Methodda ise bazı adımlarının detayı dışında algoritma bellidir.

Strategy Design Pattern‘i davranışın tamamen değiştiği durumlarda,
Template Method Design Pattern’i ise davranışın bir kısmı değiştiği durumlarda kullanılır.

Burada dikkat etmemiz gereken nokta, Strategy Design Pattern ile fazladan aynı işi yapacak olan algoritmik çalışma gerçekleştirmektense, var olan kod parçalarının yeniden kullanılabilirliğinin arttırılmasında(Code Reusability) da tercih edildiği görülmektedir.

Yani Strategy ile yazılmış kodu refactoring yaparak template metoda dönüşebiliriz