Skip to content

Commit 564e2df

Browse files
committed
Extract Policies to ResilientHttpClientFactory
1 parent d18b358 commit 564e2df

2 files changed

Lines changed: 44 additions & 48 deletions

File tree

src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs

Lines changed: 5 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ public class ResilientHttpClient : IHttpClient
2222
{
2323
private readonly HttpClient _client;
2424
private readonly ILogger<ResilientHttpClient> _logger;
25+
private readonly Func<string, IEnumerable<Policy>> _policyCreator;
2526
private ConcurrentDictionary<string, PolicyWrap> _policyWrappers;
2627

27-
public ResilientHttpClient(ILogger<ResilientHttpClient> logger)
28+
public ResilientHttpClient(Func<string, IEnumerable<Policy>> policyCreator, ILogger<ResilientHttpClient> logger)
2829
{
2930
_client = new HttpClient();
3031
_logger = logger;
32+
_policyCreator = policyCreator;
3133
_policyWrappers = new ConcurrentDictionary<string, PolicyWrap>();
3234
}
3335

@@ -130,7 +132,7 @@ private async Task<T> HttpInvoker<T>(string origin, Func<Task<T>> action)
130132

131133
if (!_policyWrappers.TryGetValue(normalizedOrigin, out PolicyWrap policyWrap))
132134
{
133-
policyWrap = Policy.Wrap(CreatePolicies());
135+
policyWrap = Policy.Wrap(_policyCreator(normalizedOrigin).ToArray());
134136
_policyWrappers.TryAdd(normalizedOrigin, policyWrap);
135137
}
136138

@@ -152,46 +154,6 @@ private static string GetOriginFromUri(string uri)
152154
var origin = $"{url.Scheme}://{url.DnsSafeHost}:{url.Port}";
153155

154156
return origin;
155-
}
156-
157-
158-
private Policy[] CreatePolicies()
159-
{
160-
return new Policy[]
161-
{
162-
Policy.Handle<HttpRequestException>()
163-
.WaitAndRetry(
164-
// number of retries
165-
6,
166-
// exponential backofff
167-
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
168-
// on retry
169-
(exception, timeSpan, retryCount, context) =>
170-
{
171-
var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " +
172-
$"of {context.PolicyKey} " +
173-
$"at {context.ExecutionKey}, " +
174-
$"due to: {exception}.";
175-
_logger.LogWarning(msg);
176-
_logger.LogDebug(msg);
177-
}),
178-
Policy.Handle<HttpRequestException>()
179-
.CircuitBreaker(
180-
// number of exceptions before breaking circuit
181-
5,
182-
// time circuit opened before retry
183-
TimeSpan.FromMinutes(1),
184-
(exception, duration) =>
185-
{
186-
// on circuit opened
187-
_logger.LogTrace("Circuit breaker opened");
188-
},
189-
() =>
190-
{
191-
// on circuit closed
192-
_logger.LogTrace("Circuit breaker reset");
193-
})
194-
};
195-
}
157+
}
196158
}
197159
}
Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http;
22
using Microsoft.Extensions.Logging;
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Threading.Tasks;
73
using Polly;
4+
using System;
85
using System.Net.Http;
96

107
namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure
@@ -17,6 +14,43 @@ public ResilientHttpClientFactory(ILogger<ResilientHttpClient> logger)
1714
=>_logger = logger;
1815

1916
public ResilientHttpClient CreateResilientHttpClient()
20-
=> new ResilientHttpClient(_logger);
17+
=> new ResilientHttpClient((origin) => CreatePolicies(), _logger);
18+
19+
private Policy[] CreatePolicies()
20+
=> new Policy[]
21+
{
22+
Policy.Handle<HttpRequestException>()
23+
.WaitAndRetry(
24+
// number of retries
25+
6,
26+
// exponential backofff
27+
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
28+
// on retry
29+
(exception, timeSpan, retryCount, context) =>
30+
{
31+
var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " +
32+
$"of {context.PolicyKey} " +
33+
$"at {context.ExecutionKey}, " +
34+
$"due to: {exception}.";
35+
_logger.LogWarning(msg);
36+
_logger.LogDebug(msg);
37+
}),
38+
Policy.Handle<HttpRequestException>()
39+
.CircuitBreaker(
40+
// number of exceptions before breaking circuit
41+
5,
42+
// time circuit opened before retry
43+
TimeSpan.FromMinutes(1),
44+
(exception, duration) =>
45+
{
46+
// on circuit opened
47+
_logger.LogTrace("Circuit breaker opened");
48+
},
49+
() =>
50+
{
51+
// on circuit closed
52+
_logger.LogTrace("Circuit breaker reset");
53+
})
54+
};
2155
}
2256
}

0 commit comments

Comments
 (0)