(更新时间)2021年5月28日 商城高并发秒杀系统(.NET Core版) 05-断路器Polly组件的封装

举报
愚公搬代码 发表于 2021/10/19 00:04:06 2021/10/19
【摘要】 一:断路器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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。