zoukankan      html  css  js  c++  java
  • 微服务入门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("结束任务");
        });
    
  • 相关阅读:
    函数式 js 接口实现原理,以及 lodash/fp 模块
    谈谈混合 App Web 资源的打包与增量更新
    如何实现 javascript “同步”调用 app 代码
    如何发布带静态资源的库——android 篇
    [老文章搬家] 关于屏蔽优酷视频广告的一个方法
    [老文章搬家] 关于 Huffman 编码
    [老文章搬家] 插件化软件设计的头疼问题以及可能的解决思路
    [老文章搬家] [翻译] 深入解析win32 crt 调试堆
    Qt 5.0+ 中 connect 新语法与重载函数不兼容问题的解决方法,以及个人看法
    武佩奇 DJango博客地址
  • 原文地址:https://www.cnblogs.com/Amayer/p/MicroService_5.html
Copyright © 2011-2022 走看看