Create new polly policies for each service instead of use the same, in order to resolve problems with the execution context name
This commit is contained in:
parent
fb15ed1e11
commit
cd1f11b480
@ -15,6 +15,7 @@ using Swashbuckle.AspNetCore.Swagger;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
|
using System.Net.Http;
|
||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator
|
namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator
|
||||||
{
|
{
|
||||||
@ -147,30 +148,37 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator
|
|||||||
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
||||||
|
|
||||||
//register http services
|
//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<IBasketService, BasketService>()
|
services.AddHttpClient<IBasketService, BasketService>()
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<ICatalogService, CatalogService>()
|
services.AddHttpClient<ICatalogService, CatalogService>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<IOrderApiClient, OrderApiClient>()
|
services.AddHttpClient<IOrderApiClient, OrderApiClient>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
|
||||||
|
{
|
||||||
|
return HttpPolicyExtensions
|
||||||
|
.HandleTransientHttpError()
|
||||||
|
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
|
||||||
|
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
|
||||||
|
|
||||||
|
}
|
||||||
|
static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
|
||||||
|
{
|
||||||
|
return HttpPolicyExtensions
|
||||||
|
.HandleTransientHttpError()
|
||||||
|
.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ using Swashbuckle.AspNetCore.Swagger;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
|
using System.Net.Http;
|
||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator
|
namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator
|
||||||
{
|
{
|
||||||
@ -150,32 +151,37 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator
|
|||||||
|
|
||||||
//register http services
|
//register http services
|
||||||
|
|
||||||
var retriesWithExponentialBackoff = HttpPolicyExtensions
|
|
||||||
.HandleTransientHttpError()
|
|
||||||
.Or<TimeoutRejectedException>()
|
|
||||||
.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<IBasketService, BasketService>()
|
services.AddHttpClient<IBasketService, BasketService>()
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<ICatalogService, CatalogService>()
|
services.AddHttpClient<ICatalogService, CatalogService>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<IOrderApiClient, OrderApiClient>()
|
services.AddHttpClient<IOrderApiClient, OrderApiClient>()
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
|
||||||
|
{
|
||||||
|
return HttpPolicyExtensions
|
||||||
|
.HandleTransientHttpError()
|
||||||
|
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
|
||||||
|
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
|
||||||
|
|
||||||
|
}
|
||||||
|
static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
|
||||||
|
{
|
||||||
|
return HttpPolicyExtensions
|
||||||
|
.HandleTransientHttpError()
|
||||||
|
.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ using Polly.Extensions.Http;
|
|||||||
using StackExchange.Redis;
|
using StackExchange.Redis;
|
||||||
using System;
|
using System;
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
|
using System.Net.Http;
|
||||||
using WebMVC.Infrastructure;
|
using WebMVC.Infrastructure;
|
||||||
using WebMVC.Infrastructure.Middlewares;
|
using WebMVC.Infrastructure.Middlewares;
|
||||||
using WebMVC.Services;
|
using WebMVC.Services;
|
||||||
@ -168,18 +169,6 @@ namespace Microsoft.eShopOnContainers.WebMVC
|
|||||||
{
|
{
|
||||||
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
||||||
|
|
||||||
//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
|
//register delegating handlers
|
||||||
services.AddTransient<HttpClientAuthorizationDelegatingHandler>();
|
services.AddTransient<HttpClientAuthorizationDelegatingHandler>();
|
||||||
services.AddTransient<HttpClientRequestIdDelegatingHandler>();
|
services.AddTransient<HttpClientRequestIdDelegatingHandler>();
|
||||||
@ -190,28 +179,28 @@ namespace Microsoft.eShopOnContainers.WebMVC
|
|||||||
services.AddHttpClient<IBasketService, BasketService>()
|
services.AddHttpClient<IBasketService, BasketService>()
|
||||||
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Sample. Default lifetime is 2 minutes
|
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Sample. Default lifetime is 2 minutes
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<ICatalogService, CatalogService>()
|
services.AddHttpClient<ICatalogService, CatalogService>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<IOrderingService, OrderingService>()
|
services.AddHttpClient<IOrderingService, OrderingService>()
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddHttpMessageHandler<HttpClientRequestIdDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientRequestIdDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<ICampaignService, CampaignService>()
|
services.AddHttpClient<ICampaignService, CampaignService>()
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
services.AddHttpClient<ILocationService, LocationService>()
|
services.AddHttpClient<ILocationService, LocationService>()
|
||||||
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
|
||||||
.AddPolicyHandler(retriesWithExponentialBackoff)
|
.AddPolicyHandler(GetRetryPolicy())
|
||||||
.AddPolicyHandler(circuitBreaker);
|
.AddPolicyHandler(GetCircuitBreakerPolicy());
|
||||||
|
|
||||||
//add custom application services
|
//add custom application services
|
||||||
services.AddTransient<IIdentityParser<ApplicationUser>, IdentityParser>();
|
services.AddTransient<IIdentityParser<ApplicationUser>, IdentityParser>();
|
||||||
@ -273,6 +262,19 @@ namespace Microsoft.eShopOnContainers.WebMVC
|
|||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
|
||||||
|
{
|
||||||
|
return HttpPolicyExtensions
|
||||||
|
.HandleTransientHttpError()
|
||||||
|
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
|
||||||
|
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
|
||||||
|
|
||||||
|
}
|
||||||
|
static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
|
||||||
|
{
|
||||||
|
return HttpPolicyExtensions
|
||||||
|
.HandleTransientHttpError()
|
||||||
|
.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user