熔断、降级:

熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也将其成为“过载保护”。

降级:降级的目的就是当某个服务提供者发生故障的时候,向调用方返回一个替代响应或者错误响应。

介绍:

POLLY是一个.NET回弹和瞬态故障处理库,它允许开发人员以流畅和线程安全的方式表达诸如重试、断路器、超时、隔板隔离和回退等策略。github官方解释嘿嘿。

Polly以.NET Standard 1.1(覆盖范围:.NET Framework 4.5-4.6.1,.NET Core 1.0,Mono,Xamarin,UWP,WP8.1 +)

.NET Standard 2.0+(覆盖范围:.NET Framework 4.6.1, .NET Core 2.0+以及后来的Mono,Xamarin和UWP目标)

安装:

首先当然是创建一个控制台项目,然后通过NuGet安装:

Install-Package Polly

出现以上界面就说明你已经安装了最新的版本到你的项目;

策略介绍:

polly通过官方介绍我们可以知道有7种恢复策略,先不管会不会,先列出来再说哈哈:

重试策略(Retry):许多故障是短暂的,并且在短暂的延迟后可能会自我纠正。允许我们做的是能够自动配置重试机制

断路器(Circuit-breaker):当一个系统严重挣扎时,快速失败优于让用户/呼叫者等待。 说白了就是应该优先直接返回失败,而不是一直让用户等待。保护故障系统免受过载可以帮助恢复。

超时(Timeout):超时策略针对的前置条件是超过一定的等待时间,想要得到成功的结果是不可能的,保证调用者不必等待超时。

隔板隔离(Bulkhead Isolation):隔板隔离针对的前置条件是当进程出现故障时,多个失败一直在主机中对资源(例如线程/ CPU)一直占用。下游系统故障也可能导致上游失败。这两个风险都将造成严重的后果。都说一粒老鼠子屎搅浑一锅粥,而Polly则将受管制的操作限制在固定的资源池中,免其他资源受其影响。

缓存(Cache):就是一些请求,会把数据缓存起来,然后在持续一段时间内,直接从缓存中取。

回退(Fallback):操作仍然会失败,也就是说当发生这样的事情时我们打算做什么。也就是说定义失败返回操作。我们在使用时就是所说的降级。

策略包装(PolicyWrap):不同的故障需要不同的策略 弹性意味着使用组合。

使用步骤:

polly一般分为三步进行:

  • 定义条件: 定义你要处理的 错误异常/返回结果

  • 定义处理方式 : 重试,熔断,回退

  • 执行

定义条件:

.Handle<ExceptionType>():限定条件的单个异常Policy;
.Handle<ExceptionType>(ex => ex.Number == 10):具有条件的单个异常类型。
.Handle<HttpRequestException>()
.Or<OperationCanceledException>():多个异常类型,当然他也可以变成具有条件的多个异常类型,类似于单个操作。

定义返回结果的条件:

.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound):用条件处理返回值,处理单个返回值。
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.InternalServerError)
.OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway):处理多个返回值。

指定策略(重试):

.Retry():重试一次。
.Retry(3):重试三次,修改数值即可定义自己想使用的次数。
.Retry(3, (exception, retryCount) =>
{
// do something
}):重试多次,在每次重试都执行一个操作,参数为:当前异常和重试计数。
.Retry(3, (exception, retryCount, context) =>
{
// do something
}):重试多次,在每次重试都执行一个操作,参数为:当前异常,重试计数和上下文
.RetryForever():永远重试直到成功,同时也也有重试的相同扩展,可以写参数。
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
}):等待并重试,就是在每个重试的时候需要等待指定的执行时间,同样有相同扩展,可以在每个重试调用一个操作。
.WaitAndRetryForever(retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
):等待和重试永远(直到成功)

指定策略(熔断):

.CircuitBreaker(2, TimeSpan.FromMinutes(1)):在指定数量的连续异常之后中断开。这里就不做过多解释了。

指定策略(降级):回退

.Fallback<UserAvatar>(UserAvatar.Blank):如果执行错误,则提供替代值,就是出现错误,定义一个返回值给他
.Fallback<UserAvatar>(() => UserAvatar.GetRandomAvatar()) :定义一个方法给他,该方法代替提供值。

执行:

.Execute(() => DoSomething()):执行一项方法
执行通过任意上下文数据的操作:
var policy = Policy
.Handle<SomeExceptionType>()
.Retry(, (exception, retryCount, context) =>
{
var methodThatRaisedException = context["methodName"];
Log(exception, methodThatRaisedException);
}); policy.Execute(
() => DoSomething(),
new Dictionary<string, object>() {{ "methodName", "some method" }}
);

 使用示例:

降级的使用代码:

 #region 降级
public static void Downgrade()
{
//降级处理程序
ISyncPolicy policy = Policy.Handle<ArgumentException>()
.Fallback(() =>
{
Console.WriteLine("降级给的返回值结果");
});
//运行程序
policy.Execute(() =>
{
Console.WriteLine("任务开始"); throw new ArgumentException("降级任务出错,马上要降级了"); Console.WriteLine("任务结束");
});
}
#endregion

运行结果:

重试机制的代码:

出错后重复3次。

 #region 重试机制
public static void Retry()
{
//配置重试次数
ISyncPolicy policy = Policy.Handle<Exception>().Retry(); try
{
policy.Execute(() =>
{
Console.WriteLine("任务开始");
if (DateTime.Now.Second % != )
{
throw new Exception("任务出错了,开始重试");
}
Console.WriteLine("任务结束");
});
}
catch (Exception ex)
{
Console.WriteLine("异常结果 : " + ex.Message);
}
}
#endregion

运行结果:

熔断机制代码:

但出现错误连续三次后,等待20秒后进行

 #region 熔断机制
public static void Fusing()
{ Action<Exception, TimeSpan> onBreak = (exception, timespan) =>
{
Console.WriteLine("");
};
Action onReset = () =>
{
Console.WriteLine("");
};
ISyncPolicy policy = Policy.Handle<Exception>().CircuitBreaker(, TimeSpan.FromSeconds(), onBreak, onReset);
while (true)
{
try
{ policy.Execute(() =>
{
Console.WriteLine("任务开始"); throw new Exception("出错了"); Console.WriteLine("任务结束");
}); }
catch (Exception ex)
{
Console.WriteLine("---------------异常结果-------------- : " + ex.Message + "时间:" + DateTime.Now);
}
System.Threading.Thread.Sleep();
}
}
#endregion

运行结果:

混合示例(重试+降级)代码:

出错重试三次后第四次进行降级处理:主要是warp方法来实现的,特别说明warp方法是:最外面(在左边)到最里面(右边)的策略。也就是说从右向左执行方法;

 #region 重试+降级
public static void RetryDowngrade()
{
try
{
//降级处理程序
ISyncPolicy policy = Policy.Handle<Exception>()
.Fallback(() =>
{
Console.WriteLine("降级成功");
});
//配置重试次数
ISyncPolicy policy2 = Policy.Handle<Exception>().Retry(, (exception, retryCount, context) =>
{
Console.WriteLine(retryCount); });
//合并
ISyncPolicy mainPolicy = Policy.Wrap(policy, policy2);
mainPolicy.Execute(() =>
{
Console.WriteLine("任务开始"); throw new Exception("出错了"); Console.WriteLine("任务结束");
});
}
catch (Exception ex)
{ Console.WriteLine("异常结果 : " + ex.Message);
}
}
#endregion

运行结果:

源码下载:PollyConsole.rar

系列目录

微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

【微服务No.2】polly微服务故障处理库的更多相关文章

  1. NET Core微服务之路:弹性和瞬态故障处理库Polly的介绍

    前言 上一节中我们介绍了Ocelot的常见使用配置,通过json配置文件,实现API网关的请求处理.和一个使用DownStream扩展下游中间件,来实现Http转RPC的简单实现,功能不算强大,但可以 ...

  2. .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...

  3. .Net Core 商城微服务项目系列(五):使用Polly处理服务错误

    项目进行微服务化之后,随之而来的问题就是服务调用过程中发生错误.超时等问题的时候我们该怎么处理,比如因为网络的瞬时问题导致服务超时,这在我本人所在公司的项目里是很常见的问题,当发生请求超时问题的时候, ...

  4. 【微服务No.1】Consul服务发现在windows下简单使用

    基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...

  5. (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...

  6. (1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个 ...

  7. 什么是微服务架构,.netCore微服务选型

    什么是微服务架构,.netCore微服务选型 https://www.cnblogs.com/uglyman/p/9182485.html 开发工具:VS2017 .Net Core 2.1 什么是微 ...

  8. Spring Cloud构建微服务架构(一)服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  9. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

随机推荐

  1. 解决Django+Vue前后端分离的跨域问题及关闭csrf验证

      前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道   在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...

  2. 我的第一次做app的细节

    第一次做一个app 发现 需要和前端沟通好而且 还要注意细节  效果图细节不要忘记 尽量多穿数据不要少传数据 而且 对接 注意细节

  3. Python-数据类型1

    在Python中常见的数据类型有:整数(int).字符串(str).小数/浮点数(float).列表.元组.字典和布尔类型等,下面会进行一一介绍. 整数和小数,不用多介绍相信大家都有所了解,字符串是用 ...

  4. DevExpress XtraTabbedMdiManager删除Page

    DevExpress XtraTabbedMdiManager删除Page 时,xtraTabbedMdiManager1.Pages.Remove()是没用的. 正确的应该是xtraTabbedMd ...

  5. Python tkinter 学习记录(一) --label 与 button

    最简的形式 from tkinter import * root = Tk() # 创建一个Tk实例 root.wm_title("标题") # 修改标题 root.mainloo ...

  6. 【RL-TCPnet网络教程】第21章 RL-TCPnet之高效的事件触发框架

    第21章       RL-TCPnet之高效的事件触发框架 本章节为大家讲解高效的事件触发框架实现方法,BSD Socket编程和后面章节要讲解到的FTP.TFTP和HTTP等都非常适合使用这种方式 ...

  7. [Swift]LeetCode132. 分割回文串 II | Palindrome Partitioning II

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  8. [Swift]LeetCode254.因子组合 $ Factor Combinations

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  9. [Swift]LeetCode472. 连接词 | Concatenated Words

    Given a list of words (without duplicates), please write a program that returns all concatenated wor ...

  10. [Swift]LeetCode675. 为高尔夫比赛砍树 | Cut Off Trees for Golf Event

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...