.NET Core 微服务之Polly重试策略
接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细。
简单介绍一下绍轻量的故障处理库 Polly Polly是一个.NET弹性和瞬态故障处理库
允许我们以非常顺畅和线程安全的方式来执行诸如重试、断路器、超时、隔离、缓存、后退等策略, 能为我们在微服务架构提供更稳定的服务。当然,目前的 Service Mesh 显得更高大上,而且更强大,它更偏向从运维层面解决以上问题,不过这还是的看具体项目中怎么去使用和决定了。
在微服务架构下,我们可能会遇到类似以下问题:
- 某些接口异常,最终造成应用程序池奔溃;
- 某些接口不稳定、偶尔超时,数据获取异常;
- 某些服务不稳定,调用方连接不上;
- 某些服务异常,最终主服务挂掉(雪崩效应);
当然在实际情况下,我们可能只需要确保提供给用户的服务是可用状态,不出现 “Service Unavailable” 这样的画面就好。至于接口偶尔异常,可能对某些类型的项目来说并不太关键,用户可能通过重新请求、刷新页面就可以解决,当然我们还可以在代码层面做兼容,满满的try/catch、for/while 循环解决重试来保证更高的可靠性。
这个时候Polly就能很好的起来作用,Polly 的使用相对比较简单,当然还是得看项目结构。我们的主项目在调用微服务接口时使用了AOP,类似这种情况下,所以调用微服务的接口都是统一入口,所以我们只需要在AOP内加上 Polly 的一些策略,其他代码不用做任何修改,就可以解决一些问题了。
安装
Install-Package Polly
使用步骤说明
- 定义策略
- 执行方法
可以看一下代码,我们项目主要使用的是Grpc这个框架,其他的微服务框架,使用起来大致差不多
public void Intercept(IInvocation invocation)
{
// some code
try
{
// 创建一个策略,如果 invocation.Proceed 的执行出现 Grpc.Core.RpcException 异常,并且 StatusCode == Grpc.Core.StatusCode.Unavailable,则重试一次
var policy = Policy
.Handle<Grpc.Core.RpcException>(t => t.Status.StatusCode == Grpc.Core.StatusCode.Unavailable)
.Retry(); // 默认一次 // 将策略应用到 invocation.Proceed 方法上
policy.Execute(invocation.Proceed);
}
catch (Exception ex)
{
// some code
Console.WriteLine($"{ ex.Message},{ex.StackTrace}");
}
}
策略条件定义
策略的执行需要依赖于条件,Polly 支持对异常与结果进行策略条件定义。
异常
// 指定某个异常
Policy
.Handle<SomeExceptionType>(); // 指定某个异常条件
Policy
.Handle<SomeExceptionType>(ex => ex.xxx == "xxx") // 指定多个异常
Policy
.Handle<SomeExceptionType1>()
.Or<SomeExceptionType2>() // 指定多个可能异常条件
Policy
.Handle<SomeExceptionType1>(ex => ex.xxx1 == "xxx")
.Or<SomeExceptionType2>(ex => ex.xxx2 == "xxx")
返回结果
// 指定某个结果
Policy
.HandleResult<ResponseMessage>(r => r.xxx == "xxx") // 指定多个可能的结果
Policy
.HandleResult<ResponseMessage>(r => r.xxx1 == "xxx")
.OrResult<ResponseMessage>(r => r.xxx2 == "xxx")
重试策略(Retry )
// 指定异常下重试一次
Policy
.Handle<SomeExceptionType>()
.Retry(); // 指定异常下重试3次
Policy
.Handle<SomeExceptionType>()
.Retry(); // 指定异常下无限重试
Policy
.Handle<SomeExceptionType>()
.RetryForever(); // 每次重试之间等待指定的时间间隔
Policy
.Handle<SomeExceptionType>()
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(),
TimeSpan.FromSeconds(),
TimeSpan.FromSeconds()
});
Retry 可以指定一个要执行的 Action。Action 参数:exception 当前异常信息,retryCount 当前执行第几次,context 当前执行上下文信息。
测试一下:
private static int times = ; public static void TestPolicy()
{
var policy = Policy
.Handle<Exception>()
.Retry(, (exception, retryCount, context) => // 出异常会执行以下代码
{
Console.WriteLine($"exception:{ exception.Message}, retryCount:{retryCount}, id:{context["id"]}, name:{context["name"]}");
}); try
{
// 通过 new Context 传递上下文信息
var result = policy.Execute(Test, new Context("data", new Dictionary<string, object>() { { "id", "" }, { "name", "beck" } }));
Console.WriteLine($"result:{result}");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} private static string Test()
{
// 每执行一次加1
times++; // 前2次都抛异常
if (times < )
{
throw new Exception("exception message");
}
return "success";
}
测试结果:

可以看到得到了咱们想要的效果,具体项目可以具体去实施,下一篇咱们接着说Polly的熔断策略。感兴趣可以自行搜索Polly的相关文档看看。
参考链接
没有彩蛋

.NET Core 微服务之Polly重试策略的更多相关文章
- .NET Core 微服务之Polly熔断策略
紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调 ...
- 微服务之Polly熔断策略
NET Core 微服务之Polly熔断策略 紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间 ...
- .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...
- (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)
一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...
- (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架
创建简单的熔断降级框架 要达到的目标是: 参与降级的方法参数要一样,当HelloAsync执行出错的时候执行HelloFallBackAsync方法. public class Person { [H ...
- .NET Core微服务之基于Ocelot实现API网关服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...
- 一个轻量级的.Net Core微服务快速开发的轮子
前言 Adnc是一个轻量级的.Net Core微服务快速开发框架,同时也可以应用于单体架构系统的开发.框架基于JWT认证授权.集成了一系列微服务配套组件,代码简洁.易上手.学习成本低.开箱即用 ...
- .NET Core微服务之基于Consul实现服务治理
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
- .NET Core微服务之基于Consul实现服务治理(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...
随机推荐
- 接口的定义——默认加public abstract默认全局常量;与继承不同,子类可以同时实现多个接口;抽象类实现接口;接口继承接口
一. 接口的定义 接口中定义的方法,全部都为抽象方法,默认加public abstract 接口中定义的变量,全部为全局常量,默认加public static final 二.与继承不同,子类可以同时 ...
- presenting view controller
Present ViewController详解 Present ViewController Modally 一.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIK ...
- (2) html 语义化
HTML语义化标签 1 什么是语义化标签? 通过标签判断内容语义,例如根据h1标签判断出内容是标题,根据 p 判断内容是段落.input 标签是输入框等. 2 为什么要标签语义化? 1.搜素引擎友好 ...
- 【转】Qt Socket简单通信
最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...
- NOIP模拟赛 双色球
[题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我考你道水题检验一下你的水平……” 一个栈内初始有n个红色和蓝色的 ...
- [LUOGU] P4251 [SCOI2015]小凸玩矩阵
行列看成点,格子看成边,二分一个边权,删去大于它的边,新图上的最大流>k则答案可以更优,小于k则调整左边界. #include<algorithm> #include<iost ...
- ubuntu : 无法安全地用该源进行更新,所以默认禁用该源。
sudo apt update报错: 无法安全地用该源进行更新,所以默认禁用该源. 1.检查是否是网络出了问题,修改DNS:114.114.114.114,8.8.8.8 断开网卡再重新连接,成功! ...
- 14Shell脚本—判断语句
判断语句 Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值. 条件测试语法的执行格式为 [ 条件表达式 ],切记,条件表达式两边均应有一个空格. 条 ...
- vue-highlightjs的使用小结
万能的github真主,让我们强大!在vue的项目中想使用highlight.js这样的代码高亮?有人帮助我们实现了vue-highlightjs 安装 yarn add highlight.js - ...
- Goroutine 中执行匿名函数 坑
//相对应for 循环 goroutine跑到慢 所以这里很大概率只会打印最后一条数据 func goRun() { values := []int{1, 2, 3} for _, v := rang ...