.Net弹性和瞬态故障处理库Polly介绍

下面就给您详细讲解一下".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技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#的加密与解密

    C#的加密与解密 C#提供了多种加密与解密方式,常见的有对称加密、非对称加密和哈希算法。 对称加密 对称加密即使用相同的密钥进行加密和解密。常见的对称加密算法有DES、AES等。 示例代码: using System.Security.Cryptography; using System.Text; public static string Encrypt(…

    C# 2023年6月1日
    00
  • asp.net 2.0中利用Ajax2.0实现JSON传送大量页面数据

    下面是关于“asp.net 2.0中利用Ajax2.0实现JSON传送大量页面数据”的完整攻略: 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,经常应用于Web开发中用来传送数据。而Ajax(Asynchronous JavaScript and XML)则是一种基于JavaScript和XML的技术,可以…

    C# 2023年5月31日
    00
  • ASP.NET Core MVC 修改视图的默认路径及其实现原理解析

    ASP.NET Core MVC 修改视图的默认路径及其实现原理解析 在ASP.NET Core MVC中,视图是用于呈现HTML内容的模板。默认情况下,视图文件存储在/Views文件夹中。但是,有时候需要将视图文件存储在不同的位置,例如在多个项目之间共享视图文件。本攻略将介绍如何修改ASP.NET Core MVC中视图的默认路径,并解析其实现原理。 步骤…

    C# 2023年5月17日
    00
  • .Net程序防止被注入代码(整站通用)分享

    针对“.Net程序防止被注入代码(整站通用)分享”,我来给您提供一份完整攻略。 一、防注入的必要性 在现代化的网站或应用开发中,很常见的一个问题是注入攻击。由于简单易学、效果显著等优势,SQL注入攻击成为了最常见的注入方式,而除此之外的命令注入、XSS等攻击手段也在继续演变。所以保障应用的安全性,开发人员必须加强对于注入攻击的防范。 二、防注入的措施 1. …

    C# 2023年5月31日
    00
  • C#异步迭代IAsyncEnumerable应用实现

    下面是“C#异步迭代IAsyncEnumerable应用实现”的完整攻略。 一、什么是异步迭代IAsyncEnumerable? 在.NET Core 3.0及以上版本中,新增加了一种异步的IEnumerable – IAsyncEnumerable。它是一种异步枚举器,可以用于异步处理序列化的数据,不再需要将整个枚举器加载到内存中,而是可以一次异步地获取单…

    C# 2023年5月15日
    00
  • C# 使用Microsoft Edge WebView2的相关总结

    下面是关于“C#使用MicrosoftEdgeWebView2的相关总结”的完整攻略,包含两个示例。 1. MicrosoftEdgeWebView2简介 MicrosoftEdgeWebView2是一个基于Chromium的Web浏览器控件,可以嵌入到Windows应用程序中。它提供了一组API,用于在应用程序中显示Web内容,并与Web内容进行交互。 2…

    C# 2023年5月15日
    00
  • .NET实现定时发送邮件代码(两种方式)

    下面是“.NET实现定时发送邮件代码”攻略的详细讲解。 一、前言 邮件是现代人与人之间联系的重要方式之一,而定时发送邮件则可以让我们更加优雅的处理邮件,不用担心自己在某些时间段错过了发送重要邮件的时机。本文将演示两种.NET中定时发送邮件代码的实现方式,供参考。 二、第一种方式:使用System.Threading.Timer类 2.1 实现原理 使用Sys…

    C# 2023年5月31日
    00
  • C#学习基础概念二十五问

    C#学习基础概念二十五问是一份用于初学者入门的C#教程,以下是详细的攻略: 目录结构 C#学习基础概念二十五问包含了C#的基础语法、面向对象编程、泛型、委托等知识点,其目录结构如下: 第1问 初学者如何在Windows上编写C#代码 第2问 什么是C#? 第3问 C#的基础语法之变量类型 第4问 C#的基础语法之运算符 第5问 C#的基础语法之流程控制语句 …

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部