概念理解
熔断 最直接的理解就是保险丝 当符合指定情况下就切断这个服务
降级:当一个服务发生故障的,会向调用方返回一个指定的替代方
简介
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("结束任务");
});