Asp.Net Core HttpClientFactory + Polly
Selamlar,
HttpClientFactory ile ilgili yazılarıma bir yenisini de Polly ile kullanımını inceleyerek devam etmek istedim.
Polly, açıkçası farkında olmasanız bile kullanmak zorunda olduğunuz bir kütüphane diyecek kadar ileri gidebilirim =) eğer ki benzer işlevleri zaten zamanında siz kendiniz farklı kütüphaneler olarak yazmadıysanız.
Polly ile ilgili yazılarıma şuradan ulaşabilirsiniz;
- Resilient Network Services Bölüm 6 – Polly
- Resilient Network Services Bölüm 6 – Polly – 2 (Fault-Response-Handling, Wait, Wait And Retry, Forever Retry Policies)
- Resilient Network Services Bölüm 6 – Polly – 3 (Circuit Breaker, Advanced Circuit Breaker, Fallback Policies)
- Resilient Network Services Bölüm 6 – Polly – 4 (Policy Execution, Configuring, Bulkhead, Cache, Policy Wrap)
Polly sizelere network haberleşmesi sırasında uygulamanızda olması gereken bir çok pattern i extension metodlar halinde sunan ve çok daha fazlasını yapmanıza olanak tanıyan bir kütüphane.
Polly ile ;
- Error ve Result Handling
- Retry, WaitAndRetry, ForeverRetry gibi senarto ve patternleri
- Circuit Breaker ve Advanced Circuit Breaker gibi senaryo ve patternleri
- Cache, Bulkhead Isolation gibi
birçok şeyi çok basit şekilde uygulamalarınıza implemente edebiliyorsunuz.
Detaylarına yukarıda ki yazılarımdan ve kendi github reposundan ulaşabilirsiniz.
Asp.Net Core projelerimizde HttpClientFactory ile beraber kullanmak için yapacağımız ilk şey nugetten aşağıdaki paketi indirmek
Microsoft.Extensions.Http.Polly
Daha sonrasında kullanım şekli önceki yöntemler ile çok benzer oluyor.
Uygulamanın startup dosyasında aşağıdaki gibi AddHttpHandler dedikten sonra o Client ile ilgili uygulamak istediğiniz policy leri fluent bir şekilde ekleyebiliyorsunuz.
public void ConfigureServices(IServiceCollection services) { services.Configure(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddHttpClient("randomuserclient") .AddPolicyHandler(Policy.TimeoutAsync(TimeSpan.FromSeconds(10))) .AddTransientHttpErrorPolicy(p => p.RetryAsync(3)); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
Yukarıdaki örneğimizde projemize NamedClient olarak eklemiş olduğumuz bir Client ın Polly yi nasıl kullanabileceğini söylemiş olduk.
Nuget ten indirdiğimiz paket ile beraber bize birçok extension metod geliyor.
Bunlardan sadece iki tanesini yukarıdaki senaryoda kullanmış olduk.
- Time out policy ekleyerek, gidecek requestlerin en fazla 10 sn bekledikten sonra eğer response alamazsa doğrudan polly tarafından hataya düşürülmesini sağladık
- Haberleşme sırasında geçici sorunlar olduğunda 3 kere yeniden denenmesini istedik. Anlık internet kayıpları, server anlık olarak response verememesi available olamaması gibi durumlarda request 3 kere yeniden denenecek.(RetryPattern)
Kullanım şekline bakığımızda ise öncekilerden hiçbir farkı yok. NamedClient eklemiş olduğumuz için aşağıdaki şekilde kullandık. Typed veya Basic usage olarak ekleseydik de o şekilde kullanacaktık. Polly nin yazarken ki dikkat etmemiz gereken tek kısmı Startup tarafında Policyleri Clientlarımıza implemente ettiğimiz kısım.
public class HomeController : Controller { private readonly IHttpClientFactory_randomUserApi; public HomeController(IHttpClientFactory randomUserApi) { _randomUserApi = randomUserApi; } public async Task Index() { var result = await IHttpClientFactory.CreateClient("randomuserclient").GetUser("10"); return View(); } ..........
Bir önceki yazımda Refit ile HttpClientFactory i nasıl kullanırız bundan bahsetmiştim. Bir de bu üçünü yani Refit + Polly + HttpClientFactory i nasıl kullanırız buna bakalım.
Aşağıda basit bir Refit interface i görüyoruz.
namespace HttpClientFactoryRefit { [Headers("Content-Type : application-json")] public interface IRandomUserApi { [Get("/")] Task GetUser(string results); } }
Nugetten aynı projemize ;
Refit.HttpClientFactory
paketini de indirdikten sonra aşağıdaki şekilde hem refit i AddRefitClient diyerek services a ekleyebilir, hem de sonrasında yukarıda ki gibi Polly Policy lerini aynı Client ın devamında ekleyebiliriz.
public void ConfigureServices(IServiceCollection services) { services.Configure(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddRefitClient() .ConfigureHttpClient(client => { client.BaseAddress = new Uri("https://randomuser.me/api"); }) .AddPolicyHandler(Policy.TimeoutAsync(TimeSpan.FromSeconds(10))) .AddTransientHttpErrorPolicy(p => p.RetryAsync(3)); ; services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
Kullanım şeklinde de Refit ile HttpClientFactory i nasıl kullanıyor isek aynı şekilde kullanmaya devam ediyoruz.
public class HomeController : Controller { private readonly IRandomUserApi _randomUserApi; public HomeController(IRandomUserApi randomUserApi) { _randomUserApi = randomUserApi; } public async Task Index() { var result = await _randomUserApi.GetUser("10"); return View(); } .........
Bu yazımızda da hem Polly ile HttpClienFactory nasıl kullanacağımızı görmüş olduk hem de bir önceki yazımızda Refit ile kullandığımız gibi refit i de işin içine dahil ettik.
Refit + Polly + HttpClienFactory üçlüsü güçlü bir Api haberleşme altyapısı için çok büyük artılar sağlayacaktır projenize.
Bir sonraki yazımda görürşmek üzere.