.net core polly(一)

nuget 下载

Polly

超时策略 超时策略分 乐观 和 悲观 

 

 

#region Polly超时策略
//Pessimistic 悲观策略
var Pessimistic = await Policy.TimeoutAsync(2, Polly.Timeout.TimeoutStrategy.Pessimistic, (context, tiemspan, t) =>
{
    Console.WriteLine("超时了");
    return Task.CompletedTask;
}).ExecuteAsync(async () =>
{
    Console.WriteLine("业务逻辑开始");
    await Task.Delay(10000);
    return Task.CompletedTask;
});
//Optimistic 乐观策略
var Optimistic = await Policy.TimeoutAsync(2, Polly.Timeout.TimeoutStrategy.Optimistic, (context, time, task) =>
{
    Console.WriteLine("超时了");
    return Task.CompletedTask;
}).ExecuteAsync(async () =>
{
    Console.WriteLine("业务逻辑开始");
    await Task.Delay(50000);

    return Task.CompletedTask;
});

 

重试策略

 

 1 #region  重试策略
 2 //根据 http请求 状态码 重试
 3 var RetryAsync = await Policy.Handle<HttpRequestException>((exception) =>
 4 {
 5     return (int)exception.StatusCode == 511;
 6 
 7 }).RetryAsync(3).ExecuteAsync(async () =>
 8 {
 9     Console.WriteLine("策略策略重试中");
10     throw new HttpRequestException("错误", new Exception(), HttpStatusCode.NetworkAuthenticationRequired);
11 
12     return Task.CompletedTask;
13 });
14 
15 #endregion

服务降级 

#region 服务降级
var fallback = Policy<string>.Handle<HttpRequestException>((exception) =>
{
    Console.WriteLine("因为收到了异常开始降级");
    return exception.StatusCode == HttpStatusCode.VariantAlsoNegotiates;
}).Or<Exception>().FallbackAsync("FALLBACK", (token) =>
{
    return Task.CompletedTask;
}).WrapAsync(Policy.Handle<HttpRequestException>().RetryAsync(3));//失败重试 3次
//执行业务方法
string reuslt = await fallback.ExecuteAsync(async () =>
{
    Console.WriteLine("执行业务");
    // throw new HttpRequestException("失败", new Exception(), HttpStatusCode.VariantAlsoNegotiates);
    throw new Exception("");
    return await Task.FromResult<string>("业务执行结束");
});
//降级方法
if (reuslt == "FALLBACK")
{
    Console.WriteLine("收到FALLBACK了,我降级了");
}
#endregion

服务熔断 状态 有 关闭 打开 半打开

 

断路(Circuit-breaker)

 

当系统遇到严重问题时,快速回馈失败比让用户/调用者等待要好,限制系统出错的体量,有助于系统恢复。比如,当我们去调一个第三方的 API,有很长一段时间 API 都没有响应,可能对方服务器瘫痪了。如果我们的系统还不停地重试,不仅会加重系统的负担,还会可能导致系统其它任务受影响。所以,当系统出错的次数超过了指定的阈值,就要中断当前线路,等待一段时间后再继续。

 

下面是一个基本的断路策略的使用方式:

 

Policy.Handle<SomeException>()
    .CircuitBreaker(2, TimeSpan.FromMinutes(1));

 

SCSS 复制 全屏

 

这句代码设定的策略是,当系统出现两次某个异常时,就停下来,等待 1 分钟后再继续。这是基本的用法,你还可以在断路时定义中断的回调和重启的回调。

.NET 开源项目 Polly 介绍 - 精致码农 - 博客园 (cnblogs.com)

 

#region 服务熔断 状态 有 关闭 打开 半打开
var CircuitBreakerAsync = Policy.Handle<Exception>().CircuitBreakerAsync(
   exceptionsAllowedBeforeBreaking: 2,
   durationOfBreak: TimeSpan.FromSeconds(5),
   //打开断路器
   onBreak: (ex, ts) =>
   {
       Console.WriteLine("打开断路器");
   },
   //关闭断路器
   onReset: () =>
   {
       Console.WriteLine("关闭断路器");
   },
   //半开
   onHalfOpen: () =>
   {
       Console.WriteLine("半开断路器");
   }
   );

var retry = Policy.Handle<HttpRequestException>().RetryAsync(3);
var polly = Policy<string>.Handle<HttpRequestException>()
    .Or<BrokenCircuitException>()
    .FallbackAsync("FallBack", (token) =>
{
    return Task.CompletedTask;
}).WrapAsync(CircuitBreakerAsync.WrapAsync(retry));

//执行业务方法
var reuslt = "";
do
{
    reuslt = await polly.ExecuteAsync(() =>
     {
         Console.WriteLine("执行业务方法");
         throw new HttpRequestException("错误", new Exception(), HttpStatusCode.UpgradeRequired);
         return Task.FromResult("FallBack");
     });
}
while (reuslt == "FallBack");
if (reuslt != "FallBack")
{
    Console.WriteLine("这里是不等于");
}
else
{
    Console.WriteLine("降级方法开始");
}
#endregion

 

posted on 2023-06-15 18:35  是水饺不是水饺  阅读(53)  评论(0)    收藏  举报

导航