Image 202
HttpClientFactory ile İstemcilerinizi Yönetin

HttpClientFactory API (Application Programming Interface) isteklerimizde kullandığımız istemcilerimizi (client) yönetmeyi sağlayan bir yöntemdir. Büyük ölçekli uygulamalarda farklı uygulamalar ile haberleşme olmazsa olmazdır. Bu ölçekteki uygulamalarda farklı sunucularda tutulan farklı uygulamaların haberleşebilmesi için API’ler kullanılmaktadır. API’ler sunucuların haberleşmesini ve uygun isteğe karşılık gelen verinin diğer sunucuya aktarılmasını sağlar. Bu sunucular iki farklı rolde olabilir. Üretici (Producer) ve Tüketici (Consumer) rollerinden birisi olabilir. Bir uygulama hem bazı verilerin üreticisi ve farklı sunuculardan gelen verilerin tüketicisi olabilir. Bu yazı kapsamında farklı sunuculardaki verileri alarak tüketen, tüketici rolündeki istekleri inceleyeceğiz. Yazının genel kapsamını belirlediğimize göre bazı kavramları daha detaylı inceleyelim.

İstemci – Sunucu (Client-Server) Mimarisi Nedir?

Sunucu ile İstemci’nin iletişime geçebilmesi için HTTP protokolü kullanılmaktadır. Bu protokol aracılığıyla istemci sunucuya belirli parametreler ile istek atmaktadır. Bu parametreler ile sunucudaki iş kuralları çalışmakta ve bu iş kuralları çerçevesinde sunucudan istemciye bir sonuç dönmektedir. Bu Mimariye İstemci-Sunucu mimarisi denir.

HttpClient Nedir?

İstemci – Sunucu mimarisinde istemci bir son kullanıcı, sunucu ise uygulamanın çalıştığı sunucu olmasına rağmen büyük ölçekli uygulamalarda sunucular arası veri iletişimine de ihtiyaç duyulmaktadır. Bu ihtiyaca yönelik olarak sunucular arası veri iletişimi API’ler ile sağlanmaktadır. C#’taki System.Net.Http namespace’i içerisindeki HttpClient sınıfı ile farklı sunucularda çalışan iş kodlarına API’ler aracılığı ile veri iletişim protokolü uygulanmaktadır. Bu sınıf sayesinde sunucumuz, istemci olabilmekte ve başka sunuculara istek atabilmektedir. C#’taki örnek kullanım “Şekil 1’deki” gibidir.

Şekil 1. İstemci – Sunucu Mimarisinde İstemci Kullanımı

Temel kullanım “Şekil 1’de” görüldüğü gibi ilgili kod bloğu her çalıştığında yeni bir HttpClient sınıfı oluşturulmaktadır. Burada using yazılı kod bloğu sonlandığında Çöp Toplayıcısı (Garbage Collector) tarafından silinmektedir. Fakat bu yöntemde büyük bir sınıf (class) olan HttpClient sınıfı, her seferinde yeniden oluşturulmakta ve kısa bir kullanımın sonunda silinmektedir. Ancak sunucudan başka bir sunucuya istekte bulunurken HttpClient sınıfında genel olarak çok az parametremiz değişmektedir. Bu parametreler istek atacağımız sunucunun adresi (URL), sunucuya göndermek istediğimiz veri (RequestBody) ,sunucuya erişimimizi belirten token (AccessToken) ve İmzalama (Signature) gibi parametrelerdir. Bu yüzden bir HttpClient örneğinden (instance) cevap (response) döndükten, sonra ilgili bu parametreleri değiştirip HttpClient örneğini tekrar tekrar kullanmak, paralel istekler atıldığı için performans sağlayacak ve yeni HttpClient örneklerini oluşturma maliyetinden kurtaracaktır. O zaman IHttpClientFactory ile nasıl istemcilerimizi etkin bir biçimde kullanabileceğimizi inceleyelim. Öncelikle kullanıcağımız bu arayüzü (interface) tanıyalım.

IHttpClientFactory Nedir?

IHttpClientFactory, HttpClient nesnelerimizi yönetmemizi sağlayan arayüzdür. Bu arayüzdeki CreateClient() metodu, kullandığımız sınıfa Bağımlılık Enjeksiyonu (Dependency Injection) ile uygulanır. Bu metod kullanılarak HttpClient örneğine ihtiyaç duyduğumuz yerde kullanılarak HttpClient örneği bu metoddan alınmaktadır. Bu şekilde yaparak sistem tarafından HttpClient örneklerimiz yönetilmektedir.

Neden IHttpClientFactory?

Çünkü normal kullanım olan “using (var client= new HttpClient());” kullanımında kod bloğu sonlandığında HttpClient örneği bellekten hemen silinirken, arka planda bu örneğin kullandığı soket (socket) hemen boşa düşmemektedir. Bu da paralel isteklerin fazla olduğu uygulamalarda soketlerin bitmesine ve bununla ilgili bazı isteklerin ağ (network) bazlı hata almasına sebep olmaktadır. Burada hatanın kaynağı yanlış istemci yönetimidir. IHttpClientFactory’nin kullanım amacını da öğrendiğimize göre kodumuza nasıl uygulayacağımızı inceleyelim.

IHttpClientFactory Kullanımı

IHttpClientFactory kullanabilmek için öncelikle startup.cs dosyasındaki ConfigureServices metoduna ilgili sınıfımızda metodları kullanabilmek için “Şekil 2’deki” değişiklikleri yapmamız gerekmektedir.

Şekil 2. Startup.cs Konfigürasyonu

“Şekil 2’de” görüldüğü gibi “services.AddHttpClient();” ile IHttpClientFactory kullandığımız sınıfa ilgili Bağımlılık Enjeksiyonunu yapmaktadır. Daha sonra “services.AddScoped<HttpRequestBase>()” metod ile de API isteklerimizi atacağımız ana sınıfımız olacak HttpRequestBase sınıfını oluşturalım.

HttpRequestBase Sınıfının Oluşturulması

Şekil 3. HttpRequestBase sınıfı

“Şekil 3’te” görüldüğü gibi IHttpClientFactory parametre alan bir yapıcı metod (Constructor) oluşturarak Bağımlılık enjeksiyonu ile ilgili bağımlığı HttpRequestBase sınıfında kullanılmaktadır. Daha sonra DoPostAsync metodunda bu arayüz üzerinden CreateClient metodu ile HttpClient oluşturulmaktadır. Oluşturduğumuz bu istemci ile HTTP isteğimizi ilgili RequestModel’i parametre olacak şekilde gönderilmekte ve cevap (response) dinamik olacak şekilde Deserialize ederek ilgili responseModel döndürülmektedir. Bu şekilde farklı RequestModel sınıflarını parametre alan ve farklı ResponseModel sınıflarını döndüren, aldığı ve döndüğü sınıf parametresi yönünden dinamik(Generic) bir metod yazarak, asenkron olarak paralel istekler atabileceğimiz bir yapıyı ortaya çıkarıyoruz. Bu altyapıyı kullanarak HTTP istemcilerimizi yönetiyoruz

Kaynaklar

1-)https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ (03.06.2023)

2-) https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests (03.06.2023)

3-) https://www.thecodebuzz.com/httpclient-using-httpclientfactory-asp-net-core/ (20.11.2023)

Muhammet Özcan
Kasım 29 , 2023
Diğer Blog İçerikleri