diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs index a18ec2dc1..1d24e8312 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs @@ -15,6 +15,7 @@ using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { @@ -147,30 +148,37 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator services.AddSingleton(); //register http services - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - - var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); - services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); return services; } + + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + + } + static IAsyncPolicy GetCircuitBreakerPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); + } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index 6eba724f2..e4a080289 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -16,6 +16,7 @@ using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator { @@ -150,32 +151,37 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator //register http services - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .Or() - .OrResult(message => message.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - - var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); - services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); return services; } + + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + + } + static IAsyncPolicy GetCircuitBreakerPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); + } } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 735e8df6c..24d2096ee 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -17,6 +17,7 @@ using Polly.Extensions.Http; using StackExchange.Redis; using System; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; using WebMVC.Infrastructure; using WebMVC.Infrastructure.Middlewares; using WebMVC.Services; @@ -168,18 +169,6 @@ namespace Microsoft.eShopOnContainers.WebMVC { services.AddSingleton(); - //Using fluent client configuration of Polly policies - //(CDLTLL) Instead of hardcoded values, use: configuration["HttpClientMaxNumberRetries"], configuration["SecondsBaseForExponentialBackoff"] - - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .OrResult(msg=>msg.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(6,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - - var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); - //register delegating handlers services.AddTransient(); services.AddTransient(); @@ -190,32 +179,32 @@ namespace Microsoft.eShopOnContainers.WebMVC services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Sample. Default lifetime is 2 minutes .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); //add custom application services services.AddTransient, IdentityParser>(); - + return services; } @@ -273,6 +262,19 @@ namespace Microsoft.eShopOnContainers.WebMVC return services; } - } + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + } + static IAsyncPolicy GetCircuitBreakerPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); + } + } }