微服务入门05 Polly熔断降级

概念理解

熔断 最直接的理解就是保险丝 当符合指定情况下就切断这个服务
降级:当一个服务发生故障的,会向调用方返回一个指定的替代方

简介

polly是一个用来简化处理的服务熔断降级的库
主要功能:

  • 重试(Retry);
  • 断路器(Circuit-breaker);
  • 超时检测(Timeout);
  • 缓存(Cache);
  • 降级(FallBack)

官网:https://github.com/App-vNext

Polly 介绍文章:https://www.cnblogs.com/CreateMyself/p/7589397.html

nuget

Install-Package Polly

FallBack

出现故障,则进入降级动作

var policy = Policy<string>
    .Handle<ArgumentNullException>()
    .Fallback(() =>
      {
          //有异常才会进入到这个里边
          Console.WriteLine("出错了");
          return "我是返回值";
      }, ex =>
      {
          //获取到了异常对象
      });

policy.Execute(() =>
       {
           Console.WriteLine("begin");
           Console.WriteLine("ed");
           return "我是返回值";
       });

Retry

var policy = Policy
        .Handle<Exception>()
         //有异常就重试 默认一次
        //.Retry();
        //sleep多长时间再试一次
        //.WaitAndRetry(100, i => TimeSpan.FromSeconds(i));
    policy.Execute(() =>
    {
        //要执行的方法
    });

CircuitBreaker

var policy = Policy
        .Handle<Exception>()
        //连续出错6次就熔断5秒,5秒后就恢复了
        .CircuitBreaker(6, TimeSpan.FromSeconds(5));

    while (true)
    {
        try
        {
            policy.Execute(() =>
            {
                Console.WriteLine("执行开始");
                throw new Exception("出异常了");
                Console.WriteLine("执行结束");
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine("保险丝断了: " + ex.Message);
        }
        Thread.Sleep(500);
    }

Wrap

可以把多个ISyncPolicy合并到一起执行:

policy3= policy1.Wrap(policy2);

执行policy3就会把policy1、policy2封装到一起执行

var retry = Policy.Handle<Exception>().Retry(3);
    var fallback = Policy.Handle<Exception>().Fallback(() =>
    {
        Console.WriteLine("降级");
    });
    //wrap 包裹,如果里面出现异常就抛到外面
    var policy = fallback.Wrap(retry);
    //Policy.Wrap(retry, fallback);//这样写的不行
    policy.Execute(() =>
    {
        Console.WriteLine("开始执行");
        throw new Exception("e");                
    });

因为是fallback包裹retry 所以会先执行重试3次在降级.若 retry包裹fallback, fallback先执行也就没有retry的事了

Timeout

Timeout生成的Policy要和其他Policy一起Wrap使用。 超时策略一般不能直接用,而是和其他封装到一起用

//如果3秒未执行完成就降级
  var timeout = Policy.Timeout(3, Polly.Timeout.TimeoutStrategy.Pessimistic);
    var fallback = Policy.Handle<Exception>().Fallback(() =>
    {
        Console.WriteLine("降级");
    });
    var policy = fallback.Wrap(timeout);           
    policy.Execute(() =>
    {
        Console.WriteLine("开始任务");
        Thread.Sleep(5000);
        Console.WriteLine("结束任务");
    });
posted @ 2018-09-08 15:09  Amayer  阅读(601)  评论(0编辑  收藏  举报