• 微服务入门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("结束任务");
        });
    
  • 相关阅读:
    Windows环境下多线程编程原理与应用读书笔记(7)————事件及其应用
    Windows环境下多线程编程原理与应用读书笔记(6)————临界段及其应用
    Windows环境下多线程编程原理与应用读书笔记(5)————互斥及其应用
    [bzoj1910] [Ctsc2002] Award 颁奖典礼
    [bzoj4411] [Usaco2016 Feb]Load balancing
    [bzoj2654] tree
    [bzoj4410] [Usaco2016 Feb]Fence in
    [bzoj3143] [Hnoi2013]游走
    [bzoj1826] [JSOI2010]缓存交换
    [bzoj1483] [HNOI2009]梦幻布丁
  • 原文地址:https://www.cnblogs.com/Amayer/p/MicroService_5.html
Copyright © 2020-2023  润新知