下面就给您详细讲解一下".Net弹性和瞬态故障处理库Polly介绍",这是一款.net生态中十分优秀的库,能够让开发者更好的处理瞬态故障和弹性处理,提高开发效率和用户体验。
Polly简介
什么是Polly?
Polly(Polly.Extensions.Http)基于.NET Standard和.NET Core。Polly是.NET弹性和瞬态故障处理库,快速、稳定、健壮的处理您的应用程序的故障。Polly允许执行重试、熔断、断路器和超时等削弱策略。
主要功能
-
Retries:执行一个操作时,如果该操作失败,Polly可以在一定数量或一定时间内对该操作进行重试。
-
Circuit-Breaker:当应用程序中的一个组件失败时,断路器模式可以停止该组件的调用,并检测该操作是否可以重试。
-
Fallbacks:如果发生失败,Polly可以从备选聚合中取回数据。
-
Time-outs:为进行故障尝试的期间设置超时限制。
Polly入门
引入Polly
Polly是通过NuGet引入的,在Visual Studio中,可以通过NuGet包控制台或NuGet包管理器,或者手动修改项目文件的方式安装,在本文中,我们使用NuGet包管理器安装Polly,输入以下命令:
Install-Package Polly
Install-Package Polly.Extensions.Http
安装好了之后,就可以在代码中使用Polly的特性了。
使用Polly
下面我们将会对Polly进行简单的Demo演示,来帮助您更好的了解Polly的使用方法。
例如,现在我们有一个方法,它必须尝试3次后才能成功,如果前3次都失败了,那么就抛出失败信息。
private static async Task<string> SearchGoogle()
{
var retryCount = 3;//最多重试3次
var delay = TimeSpan.FromSeconds(3);//3秒后重试
var policy = Policy
.Handle<Exception>()
.WaitAndRetryAsync(retryCount, i => delay);//定义Policy
return await policy.ExecuteAsync(async () =>
{
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://www.google.com");
return await response.Content.ReadAsStringAsync();
});
}
上面代码中,我们使用了WaitAndRetryAsync()
方法,传入一个重试次数和一个TimeSpan参数来确定重试时间间隔,当出现Exception
异常时,执行重试逻辑。
此外,您也可以使用CircuitBreakerPolicy
来定义断路器等。
var circuitBreakerPolicy = Policy
.Handle<HttpRequestException>() //定义需要熔断的异常类型
.CircuitBreaker(3, TimeSpan.FromSeconds(10),
(exception, duration) =>
{
Console.WriteLine($"打开断路器, 抛出异常: {exception.Message}, 将持续 {duration.Seconds}s.");
},
() =>
{
Console.WriteLine("断路器关闭");
//断路器重置了
});
上面这个例子是定义一个熔断器,当某个HTTP请求发生了3次异常时,会将该服务节点标记为不可用状态,并输出相关信息。注意:需要注意的是,在我们使用断路器的同时,还要注意熔断器是有状态的,在失败3次后会将运行状态设置为断开,因此在熔断关闭之前,操作始终不会执行。
示例
示例1:Polly的WaitAndRetryAsync()方法
static async Task Main(string[] args)
{
await Task.Run(() => OnStart());
Console.ReadLine();
}
static async Task OnStart()
{
var retryCount = 3;//最多重试3次
var delay = TimeSpan.FromSeconds(3);//3秒后重试
var policy = Policy
.Handle<Exception>()
.WaitAndRetryAsync(retryCount, i => delay);//定义Policy
await policy.ExecuteAsync(async () =>
{
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://www.baidu.com/home/msg/data/personalcontent");
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);//输出请求结果
});
}
从上面的代码示例可以看出,我们在使用了WaitAndRetryAsync()
方法时,使用了一个策略(Policy),它能够按照特定的步奏执行当前方法,达到了性能优化的优化目的,这是比较实用的一个设计。在某些情况下,可以非常快速的在多种数据中完成多次请求的操作,并在执行完成后及时对客户端进行响应。
示例2:CircuitBreakerPolicy的使用
下面是一个对http请求进行熔断的示例
static async Task Main(string[] args)
{
await Task.Run(() => OnStart());
Console.ReadLine();
}
static async Task OnStart()
{
var circuitBreakerPolicy = Policy
.Handle<HttpRequestException>() //定义需要熔断的异常类型
.CircuitBreaker(3, TimeSpan.FromSeconds(10),
(exception, duration) =>
{
Console.WriteLine($"打开断路器, 抛出异常: {exception.Message}, 将持续 {duration.Seconds}s.");
},
() =>
{
Console.WriteLine("断路器关闭");
//断路器重置了
});
await circuitBreakerPolicy.ExecuteAsync(async () =>
{
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://www.baidu.com/home/msg/data/personalcontent");
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);
});
}
从上面示例可以看出,通过熔断器的运作可以有效的保证我们当前请求的可用性,并在此过程中获得更高的处理效果。这也是POLLY框架被广大开发者青睐的原因之一。
同时,Polly还具有简化代码和优化代码效果,提高了程序的可靠性,确保了程序的稳定性,大大的缩短了我们的开发时间,提升程序的灵活性和可维护性,适合在大型.NET项目中应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net弹性和瞬态故障处理库Polly介绍 - Python技术站