基于netcore的微服务——Polly(2)

一、什么是熔断降级

1.熔断

熔断就是“保险丝“,当初夏四年某种情况时,切断服务,防止应用程序不断得尝试执行失败得操作给系统造成雪崩,或者大量得超时等待,使系统卡死。

2.降级

目的是使某个服务提供者发生故障得时候,向调用方返回一个错误得响应或者替代响应。
例如:服务A失败,改用服务B,B失败,该为服务C,C失败,改为缓存加载,如果还失败,从本地加载,再失败就返回失败,逐层降级处理。

二、Polly简介

.Net Core中被.Net基金会认可得库,用来简化,熔断降级处理。

1.功能

重试(retry)
断路器(Circuit-breaker)
超时检测(Timeout)
降级(FallBack)
缓存不好用,所以不做学习
缓存(Cache)

2.组成

polly得策略又”故障“和”动作“两部分组成

(1)故障

包括异常,超时

(2)动作

包括FallBack(降级),重试(retry),熔断(Circuit-breaker)等

三、实例源码

引入包

    <PackageReference Include="Polly" Version="6.0.1" />
using Polly;
using Polly.Timeout;
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace pollytest1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 降级策略
            定义故障
            //Policy<string> policy = Policy<string>.Handle<Exception>(ex=>ex.Message =="数据错误").
            //    //出现故障后得处理
            //    //降级处理
            //    Fallback(() =>
            //    {
            //        Console.WriteLine("fallback");
            //        return "降级后给你得值";
            //    });
            正真得业务逻辑
            //string result = policy.Execute(() =>
            //{
            //    Console.WriteLine("开始执行");
            //    throw new ArgumentException();
            //    Console.WriteLine("执行结束");
            //    return "正常值";
            //});
            //Console.WriteLine(result);
            #endregion
            #region 重试策略
            //try
            //{
            //    Policy policy = Policy.Handle<Exception>()
            //        //重试一次
            //        .Retry();
            //        //重试三次
            //        //.Retry(3);
            //    policy.Execute(() =>
            //    {
            //        Console.WriteLine("开始任务");
            //        if (DateTime.Now.Second % 10 != 0)
            //        {
            //            throw new Exception("出错");
            //        }
            //        Console.WriteLine("完成任务");
            //    });
            //}
            //catch
            //{
            //    Console.WriteLine("出现未捕获得异常");
            //}
            #endregion
            #region 策略得封装 可以将多个策略合并在一起使用
            //Policy policyRetry = Policy.Handle<Exception>()
            //       .Retry(3);
            //Policy policeFallback = Policy.Handle<Exception>()
            //    .Fallback(() =>
            //    {
            //        Console.WriteLine("fallback");         
            //    }); 
            wrap包裹,降级策略包裹了重试策略,先重试三次,再降级
            //Policy policy = policeFallback.Wrap(policyRetry);
            //policy.Execute(() =>
            //{
            //    Console.WriteLine("开始任务");
            //    if (DateTime.Now.Second % 10 != 0)
            //    {
            //        throw new Exception("出错");
            //    }
            //    Console.WriteLine("完成任务");
            //});
            #endregion
            #region 超时策略 :避免接口长期没有响应造成系统卡死
            超时策略,如果规定时间没有响应,就抛出异常
            //Policy policytimeout = Policy.Timeout(3, TimeoutStrategy.Pessimistic);
            降级策略,出现异常,则实现降级
            //Policy policyFallback = Policy.Handle<TimeoutRejectedException>()
            //    .Fallback(() =>
            //    {
            //        Console.WriteLine("降级");
            //    });
            降级策略包裹超时策略
            //Policy policy = policyFallback.Wrap(policytimeout);
            //policy.Execute(() => 
            //{
            //    Console.WriteLine("开始任务");
            //    Thread.Sleep(5000);
            //    Console.WriteLine("任务完成");
            //});
            #endregion
            #region
            Test1();
            static async Task Test1()
            {
                Policy<byte[]> policy = Policy<byte[]>
                    .Handle<Exception>()
                    .FallbackAsync(async c =>
                    {
                        Console.WriteLine("执行出错");
                        return new byte[0];
                    },async r=>
                    {
                        Console.WriteLine(r.Exception);
                    });
                policy = policy.WrapAsync(Policy.TimeoutAsync(20, TimeoutStrategy.Pessimistic,async (context,timesapn,task)=>
                {
                    Console.WriteLine("timeout");
                }));
                var bytes = await policy.ExecuteAsync(async () =>
                {
                    Console.WriteLine("开始任务");
                    HttpClient httpClient = new HttpClient();
                    var result = await httpClient.GetByteArrayAsync("https://csdnnews.blog.csdn.net/article/details/124813425?spm=1000.2115.3001.5926");
                    Console.WriteLine("完成任务");
                    return result;
                });
                Console.WriteLine("bytes长度"+bytes.Length);
            }

            #endregion
            Console.ReadKey();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值