.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#如何通过RFC连接sap系统

    这里是C#通过RFC连接SAP系统的详细攻略。 一、前置要求 在进行RFC连接SAP系统之前,需要准备以下条件和环境: 已安装SAP GUI或SAP RFC SDK(建议使用SAP RFC SDK) 已获得SAP系统的RFC连接权限 熟悉C#编程语言 二、SAP RFC SDK介绍 SAP RFC SDK是一个允许开发人员使用C/C++或C#等语言连接到SA…

    C# 2023年5月15日
    00
  • 实例详解C#实现http不同方法的请求

    我来为你详细讲解一下“实例详解C#实现http不同方法的请求”的攻略。 1. 引言 Http请求是开发中常见的场景,而C#作为微软提供的开发语言,也有自己的内置HttpWebRequest和HttpClient类,可以很方便地实现Http请求。本攻略将通过详尽的代码示例,来说明如何使用C#实现Http不同方法的请求。 2. 前置条件 在实现Http请求前,需…

    C# 2023年5月31日
    00
  • Asp.net SignalR创建实时聊天应用程序

    Asp.net SignalR是微软推出的一个开源的库,可以用来开发实时应用程序,例如:聊天应用、实时消息推送、实时数据更新等等。 下面是创建Asp.net SignalR实时聊天应用程序的完整攻略步骤: 步骤1:创建Asp.net MVC项目 首先,在Visual Studio中创建Asp.net MVC项目,命名为ChatRoom。 步骤2:添加Sign…

    C# 2023年5月31日
    00
  • C#如何将DLL打包到程序中

    C#中往往会用到外部DLL来实现某些功能,但是如果希望打包成一个独立的应用,就需要将这些DLL打包到程序中。下面是详细讲解“C#如何将DLL打包到程序中”的完整攻略: 1. 使用NuGet管理依赖项 NuGet是一个可以在Visual Studio中使用的包管理器,使用NuGet可以方便的引入和管理各种依赖项,也包括需要打包到程序中的DLL。下面是使用NuG…

    C# 2023年6月6日
    00
  • 详解c# Emit技术

    当我们需要在C#中动态生成IL代码时,C# Emit技术就变得非常有用了。本文将详细介绍C# Emit技术,并提供两个示例来帮助您更好地理解它。 C# Emit技术 C# Emit技术是.NET框架提供的一项功能强大的动态代码生成技术。通过它,我们可以使用C#代码动态地生成并编译IL代码,实现很多与程序运行时生成代码有关的场景。 C# Emit技术一般用于以…

    C# 2023年5月15日
    00
  • .NetCore手动封装日志组件的实现代码

    手动封装日志组件是一种常见的.NET Core开发技巧,可以帮助我们更好地管理和记录应用程序的日志信息。下面是手动封装日志组件的实现代码攻略: 创建日志组件类:首先,我们需要创建一个日志组件类。我们可以在.NET Core应用程序中创建一个名为Logger的类,并添加以下代码: using System; public class Logger { publ…

    C# 2023年5月16日
    00
  • C# Count:获取集合中的元素数

    C#中的Count方法是用来统计序列中满足指定条件的元素个数的方法。它属于LINQ扩展方法,可以用于IEnumerable泛型接口的所有实现类。下面我们将详细讲解C# Count方法的使用。 基本语法 Count方法的基本语法如下: int count = source.Count(); 其中,source表示需要统计元素个数的序列。Count方法返回一个i…

    C# 2023年4月19日
    00
  • C#各种异常处理方式总结

    C#各种异常处理方式总结 什么是异常? 异常是指在程序运行过程中遇到的错误或情况,可以是处理到了程序正常运行范围之外的数据输入或其他问题。 异常处理的意义 在编写程序时,我们需要预先考虑到可能出现的异常情况,以规避程序崩溃或数据丢失等问题。异常处理可以帮助我们及时捕获异常并进行处理,避免程序崩溃或数据不完整。 异常处理方式 C#提供了多种异常处理方式,包括使…

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