使用.NetCore 控制台演示 熔断 降级(polly)
1、熔断降级的概念:
熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设),现在我想用力把这根钢铁折弯,但是人的力有限达不到折弯的点,然后我使用火给钢铁加热,每隔一段时间我就会尝试一下是否能折弯,在这个过程中我发现,随着不断的煅烧,折弯钢铁是花费的力气越小,在这个过程出现了意外因为我的疏忽,温度超过了钢铁的熔点了,导致一根变成的两根,和我最初的目的相违背了,早知道当初我装个报警的装置了还可以提想我。
如果在这个例子中我们把一根钢铁换成我们程序中的接口(接口能同时承受1000的访问),然后把火替换成我们的接口调用者,当接口的并发超过1000这个点的时候接口将会挂掉,作为调用者并不能控制这个点,当并发量上来的时候导致接口蹦了,为了防止我们的接口发生崩溃的情况,我们做一个报警的设置,当发生这个情况的时候占时切断服务,防止服务崩溃。
降级:接着上一个例子:既然这个钢铁因为一个意外导致变成两个,不能进行使用了,我变找了一个绳子替代一下。
当我们的服务接口发生错误的时候,我们可以找到一个替代方法进行使用。这个方法可能是启用另一台服务器的接口,也可能是只返回“”服务器繁忙请重试的提示“”。总之不会把一个系统级别的问题暴露给用户,让使用者的程序也出现问题。
2、Polly的7中策略
处理熔断降级的框架本人所知 有NetFlix的Hystrix框架和Polly框架我们将使用Polly进行熔断降级处理。
Polly的概念:Polly是一个被.net基金会支持认可的框架,Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达策略,如重试、断路器、超时、舱壁隔离和回退。
Polly的7种策略:官方文档是这么说的:
1、重试(Retry):当程序发生短暂的故障、并且故障在延迟后,可以自动纠正的,前期是暂时的我们可以配置自动重试。
2、断路器(Circuit-Breaker):当一个系统陷入严重的问题时,让系统快速的失败,比让用户一直等待着要好的多,保护一个系统不受过载的影响,可以帮助它快速的恢复。
3、超时(Timeout):在等待一定的时间后,没有返回相应的结果,保证程序不会一直等待下去,使调用者不必一直的等待下去。
4、隔离(Bulkhead Isolation):当进程出现故障的时,一台主机中的多个失败的进程,对资源(例如线程/CPU)的一直占用,当下游的系统发生故障的时候,也可能导致上游对资源的调用失败、这两种风险的出现都将导致更大范围的影响、隔离策略是为了防止“一个点的失败导致整盘的失败”把受到管理的操作固定在某个资源中,避免影响到其他的资源。
5、缓存(Cache):针对相同的请求,在第一次访问的时候将响应的数据进行缓存,再次访问的时候直接在缓存中提供响应的数据。
6、回退(FallBack):当程序发生失败的情况的时候,我们将做些什么,定义一个在程序发生失败的时候要执行的动作。
7、策略组合(PolicyWrap):Polly针对不同的故障有不同的策略,我们可以灵活的组合策略,上述的六种策略可以灵活组合使用。
3、Polly的基本用法
因为Polly对NetCore的友好支持,下面我们将使用Core的控制台对Polly的几种策略进行简单的演示
首先创建控制台程序

在Nuget的控制台中使用 Install-Package Polly 命令进行安装
注意:在创建项目的时候命名尽量不要使用Polly命名
Polly 每个版本的介绍 https://www.nuget.org/packages/Polly/
执行命令进行安装如下图所示

首先我们要学会并且指定希望Policy 处理的异常:
/*
*指定Policy希望策略处理的异常/错误
* 这里只是制定Policy 处理异常的方案不做任何的处理
*/ //单个不加对异常加条件
Policy.Handle<Exception>(); //单个对处理的异常加上条件 这里的条件指明了当异常的 HResult 值为 -2146233088 时处理异常
Policy.Handle<Exception>(ex => ex.HResult == -); //多个使用Or即可 多个不加条件
Policy.Handle<HttpRequestException>().
Or<OperationCanceledException>(); //多个加条件
Policy.Handle<HttpRequestException>(ex => ex.HResult == ).
Or<OperationCanceledException>(ex => ex.HResult == ); //多个混合加条件
Policy.Handle<HttpRequestException>().
Or<OperationCanceledException>(ex => ex.HResult == ).
Or<ArgumentException>(ex => ex.HResult == ).
Or<ArgumentException>();
下面我们指定一个希望Policy处理的异常,并且完成调用
/*
*指定Policy 处理的异常/错误为 错误的基类 Exception 并且给异常加上条件
*如果条件不满足则不做任何处理
* 不作处理程序将会报错 var PolicyExecute = Policy.Handle<Exception>(ex => ex.HResult == -2146233088).Fallback(() =>//动作
{
Console.WriteLine($"执行出错监控的异常为:Exception 异常 HResult值为:-2146233088 ");
//Console.WriteLine($"执行出错监控的异常为:ArgumentException 异常 HResult值为:-2147024809 ");
}); //执行
PolicyExecute.Execute(() =>
{
Console.WriteLine("********************开始执行程序**************************");
//直接抛出异常(Exception) HResult值为 -2146233088
throw new Exception();
//throw new ArgumentException();
}
);
*/
因为throw new Exception();的 HResult 的值为
如图所示

执行结果为:

当我们使用throw new ArgumentException(); 时 它的HResult 的值为
如图所示:

执行结果为:
因为我们没有做任何的处理所以程序直接报错

上面演示了Policy的基本用法
4、Polly7种策略的使用
1、重试策略(Retry):
/* Policy的重试策略 Retry
* 如果程序发生错误将重新执行 3 次
int Count = 0;
var PolicyExecutes =
Policy<object>.Handle<Exception>(ex => ex.HResult == -2146233088)
.Retry(3, (ex, Index) => {
Console.WriteLine($"执行出错监控的异常为:Exception 异常 HResult值为:-2146233088 ");
Console.WriteLine($"第{Index}次 Retry(重试)");
}
).Execute(() =>
{
Console.WriteLine("********************开始执行程序**************************");
Count = Count + 1;
if (Count > 3)
{
Console.WriteLine("执行成功");
Console.WriteLine("********************结束执行程序**************************");
return "";
}
else
{
throw new Exception();
} });
*/
执行结果:

2、断路器(Circuit-Breaker)
/*******************************************************************************************************/
/* Policy的断路器策略 Circuit-Breaker
* 程序首次被访问如果连续出现三次错误后,将暂停3秒,三秒结束后 可以被继续访问
* 继续访问时 如果第一次就出现错误 继续熔断 var PolicyExecutes =
Policy<object>.Handle<Exception>()
.CircuitBreaker(3, TimeSpan.FromSeconds(3)); //模拟访问十次
for (int i = 0; i < 10; i++)
{
try
{
PolicyExecutes.Execute(() =>
{
Console.WriteLine("********************开始执行程序**************************");
throw new Exception("异常");
});
}
catch (Exception ex)
{
Console.WriteLine($"Exception信息{i}" + ex.Message);
}
//一秒运行一次
Thread.Sleep(1000);
}
*/
执行结果:

3、 超时策略(Timeout)
/*Policy的超时策略(Timeout)
* 程序本身没有错误就是执行的时间超过了我们制定的超时策略的时间然后程序就抓捕到超时的异常 try
{
//超时策略
Policy policy = Policy.Timeout(3, TimeoutStrategy.Pessimistic); policy.Execute(() =>
{
Console.WriteLine("********************开始执行程序**************************");
Thread.Sleep(5000);
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
*/
执行结果:

4、隔离策略(Bulkhead Isolation)
/*Policy的隔离策略(Bulkhead Isolation)
*
//制定策略最大的并发数为5
Policy PolicyExecutes = Policy.Bulkhead(5);
//程序运行6次 总会有一个失败的,但是这个失败的不会影响其他5个的执行结果
for (int i = 0; i < 6; i++)
{
Task.Factory.StartNew(() =>
{
try
{
PolicyExecutes.Execute(() =>
{
Console.WriteLine($"********************开始执行程序**************************");
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
});
}
*/
执行结果:

5、缓存策略(Cache):
/*Policy 缓存策略(Cache)
* 控制台不方便演示
* Policy.Cache 可以指定 过期时间,绝对过期时间,滑动过期时间等 //Policy 的缓存策略的制定
MemoryCache memoryCache = null;
var PolicyExecutes = Policy.Cache(memoryCache, TimeSpan.FromMinutes(5));
*/
6、 回退(FallBack)
/*Pollcy 的回退策略(FallBack)
* FallBack 当主程序发生错误是我们启动备用的程序进行程序处理 var PolicyExecute = Policy.Handle<Exception>().Fallback(() =>
{
Console.WriteLine($"你的程序报错了,我是替代程序!"); }); //执行
PolicyExecute.Execute(() =>
{
Console.WriteLine("********************开始执行程序**************************");
throw new Exception();
}
);
*/
执行结果:

7、策略组合(PolicyWrap)
PolicyWrap的上面六种策略可以任意的组合起来使用:我们将超时策略(Timeout)加上回退(FallBack)策略组合使用
//Fallback策略
Policy PolicyExecute = Policy.Handle<Exception>().Fallback(() =>
{
Console.WriteLine($"你的程序超时了,我是替代程序!"); });
//超时策略
PolicyExecute = PolicyExecute.Wrap(Policy.Timeout(, TimeoutStrategy.Pessimistic));
//执行
PolicyExecute.Execute(() =>
{
Thread.Sleep();
}
);
执行结果:

OK
这些只是简单的演示,官方文档更加详细。
下一篇我们是使用 Aop 基于 AspNetCore 的过滤器 实现一下Policy 的使用。
有不足之处 希望大家指出相互学习,
本文原创:转载请注明出处 谢谢!
使用.NetCore 控制台演示 熔断 降级(polly)的更多相关文章
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级
相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...
- 熔断 降级(polly)
熔断 降级(polly) https://www.cnblogs.com/szlblog/p/9300845.html1.熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设 ...
- ASP.NET Core 微服务初探[2]:熔断降级之Polly
当我们从单体架构迁移到微服务模式时,其中一个比较大的变化就是模块(业务,服务等)间的调用方式.在以前,一个业务流程的执行在一个进程中就完成了,但是在微服务模式下可能会分散到2到10个,甚至更多的机器( ...
- (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)
一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...
- (5).NET CORE微服务 Micro-Service ---- 熔断降级(Polly)
一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...
- 熔断降级(Polly)
熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务 ...
- asp.net core 使用HttpClientFactory Polly实现熔断降级
前言 在++NET Core2.1++后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用usin ...
- 用HttpClientFactory来实现简单的熔断降级
前言 在2.1之后,有不少新东西,其中HttpClientFactory算是一个.HttpClientFactory涉及的东西也不算少,三四种clients , 请求中间件,与Polly的结合,生命周 ...
- Spring Cloud Alibaba(三)Sentinel之熔断降级
本项目演示如何使用 Sentinel 完成 Spring Cloud 应用的熔断降级调用. Sentinel 是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel 把流量作为切入点,从流量控制, ...
随机推荐
- Hadoop权限管理
1.Hadoop权限管理包括以下几个模块: (1) 用户分组管理.用于按组为单位组织管理,某个用户只能向固定分组中提交作业,只能使用固定分组中配置的资源:同时可以限制每个用户提交的作业数,使用的资源量 ...
- jdbc 增删改查以及遇见的 数据库报错Can't get hostname for your address如何解决
最近开始复习以前学过的JDBC今天肝了一晚上 来睡睡回笼觉,长话短说 我们现在开始. 我们先写一个获取数据库连接的jdbc封装类 以后可以用 如果不是maven环境的话在src文件下新建一个db.pr ...
- sql server 任务调度与CPU
一. 概述 我们知道在操作系统看来, sql server产品与其它应用程序一样,没有特别对待.但内存,硬盘,cpu又是数据库系统最重要的核心资源,所以在sql server 2005及以后出现了SQ ...
- python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...
- Spring Boot 定义系统启动任务,你会几种方式?
在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...
- html5中的indexDB
1.关系型数据库和非关系型数据库 一致性: 事务完成时,必须让所有的数据具有一致的状态,例如要写入100个数据,前99个成功了,结果第100个不合法,此时事务会回滚到最初状态.这样保证事务结束和开始时 ...
- 我的Lambda的学习笔记
前述 Lambda表达式是 Java 8 的新特性.许多语言都有 Lambda 的特性. 因此使用的 Java 环境一定要 8 以上的环境. Lambda 到底什么是 Lambda 表达式呢? Lam ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- Python:游戏:300行代码实现俄罗斯方块
本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很难啊, ...
- Java-每日编程练习题①
1.输出打印一个九九乘法表 代码如下,很简单的一个for的嵌套循环即可实现 /** * 输出9*9口诀. * * @author ChenZX * */ public class Test01 { p ...