(更新时间)2021年5月28日 商城高并发秒杀系统(.NET Core版) 05-断路器Polly组件的封装
【摘要】
一:断路器Polly组件的封装
/// <summary>
/// HttpClient熔断降级策略选项
/// </summary>
public class PollyHtt...
一:断路器Polly组件的封装
/// <summary>
/// HttpClient熔断降级策略选项
/// </summary>
public class PollyHttpClientOptions
{
//1、设置默认值
public PollyHttpClientOptions()
{
this.TimeoutTime = 60;
this.RetryCount = 3;
this.CircuitBreakerOpenFallCount = 2;
this.CircuitBreakerOpenFallCount = 5;
this.ResponseMessage = "服务熔断降级了~~~";
}
/// <summary>
/// 超时时间设置,单位为秒
/// </summary>
public int TimeoutTime { set; get; }
/// <summary>
/// 失败重试次数
/// </summary>
public int RetryCount { set; get; }
/// <summary>
/// 执行多少次异常,开启短路器(例:失败2次,开启断路器)
/// </summary>
public int CircuitBreakerOpenFallCount { set; get; }
/// <summary>
/// 断路器开启的时间(例如:设置为2秒,短路器两秒后自动由开启到关闭)
/// </summary>
public int CircuitBreakerDownTime { set; get; }
/// <summary>
/// 降级处理(将异常消息封装成为正常消息返回,然后进行响应处理,例如:系统正在繁忙,请稍后处理.....)
/// </summary>
public string ResponseMessage { set; get; }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
二:配置选项
/// <summary>
/// 微服务中HttpClient熔断,降级策略扩展
/// </summary>
public static class PollyHttpClientServiceCollectionExtensions
{
/// <summary>
/// Httpclient扩展方法
/// </summary>
/// <param name="services">ioc容器</param>
/// <param name="name">HttpClient 名称(针对不同的服务进行熔断,降级)</param>
/// <param name="action">熔断降级配置</param>
/// <param name="TResult">降级处理错误的结果</param>
/// <returns></returns>
public static IServiceCollection AddPollyHttpClient(this IServiceCollection services, string name, Action<PollyHttpClientOptions> action)
{
// 1、创建选项配置类
PollyHttpClientOptions options = new PollyHttpClientOptions();
action(options);
// 2、封装降级消息
var fallbackResponse = new HttpResponseMessage
{
Content = new StringContent(options.ResponseMessage), // 降级消息
StatusCode = HttpStatusCode.GatewayTimeout // 降级状态码
};
// 2、配置httpClient,熔断降级策略
services.AddHttpClient(name)
//1.1 降级策略
.AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(fallbackResponse, async b =>
{
// 1、降级打印异常
Console.WriteLine($"服务{name}开始降级,异常消息:{b.Exception.Message}");
// 2、降级后的数据
Console.WriteLine($"服务{name}降级内容响应:{fallbackResponse.RequestMessage}");
await Task.CompletedTask;
}))
// 1.2 断路器策略
.AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().CircuitBreakerAsync(options.CircuitBreakerOpenFallCount, TimeSpan.FromSeconds(options.CircuitBreakerDownTime), (ex, ts) =>
{
Console.WriteLine($"服务{name}断路器开启,异常消息:{ex.Exception.Message}");
Console.WriteLine($"服务{name}断路器开启时间:{ts.TotalSeconds}s");
}, () =>
{
Console.WriteLine($"服务{name}断路器关闭");
}, () =>
{
Console.WriteLine($"服务{name}断路器半开启(时间控制,自动开关)");
}))
// 1.3 重试策略
.AddPolicyHandler(Policy<HttpResponseMessage>
.Handle<Exception>()
.RetryAsync(options.RetryCount)
)
// 1.4 超时策略
.AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(options.TimeoutTime)));
return services;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
文章来源: codeboy.blog.csdn.net,作者:愚公搬代码,版权归原作者所有,如需转载,请联系作者。
原文链接:codeboy.blog.csdn.net/article/details/117375763
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)